[問題] 有關於指標的題目

看板C_and_CPP (C/C++)作者 (下棋逍遙遊)時間11年前 (2015/03/13 10:37), 編輯推噓3(3042)
留言45則, 9人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) C 問題(Question): char *aa; int *bb; short *cc; aa, bb, cc 的內容都是0,請寫出 *(aa+3), *(bb+6), *(cc+10) 所指到的位置 補充說明(Supplement): 只到的地方都NULL沒有宣告阿,是在問什麼? -- 網誌文章(慎入):http://ppt.cc/NYed 學習,就要思考它的價值:http://ppt.cc/NQrD 電競,是必要的嗎:http://ppt.cc/3n4g 鬥棋(小說):http://ppt.cc/WPqF 殘局PK戰:http://ppt.cc/FpGm -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.34.1.171 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1426214240.A.BD7.html

03/13 10:45, , 1F
沒看錯的話 應該是問你三個char 六個int 十個short
03/13 10:45, 1F

03/13 10:45, , 2F
多大吧..?
03/13 10:45, 2F

03/13 12:04, , 3F
想考你知不知道指標上的加號跟指標類型有關
03/13 12:04, 3F

03/13 12:05, , 4F
不過他的問法滿奇怪的
03/13 12:05, 4F

03/13 12:51, , 5F
http://ideone.com/lRxPEI 大概就是這個意思吧?
03/13 12:51, 5F

03/13 17:46, , 6F
aa=3 bb=24 cc=20,猜要的是這個
03/13 17:46, 6F

03/13 19:29, , 7F
*(aa+3)什麼的的型態又不是指標 怎麼會問指到哪裡= =
03/13 19:29, 7F

03/14 00:06, , 8F
這些全是undefined behavior
03/14 00:06, 8F

03/14 01:17, , 9F
我猜他想問的是&(*(aa+3))吧?
03/14 01:17, 9F

03/14 01:17, , 10F
只是的確都是undefined behavior... XD 根本不知道有沒
03/14 01:17, 10F

03/14 01:17, , 11F
有吃到不該吃的記憶體
03/14 01:17, 11F

03/14 01:18, , 12F
* = 提取,這動作會要命的
03/14 01:18, 12F

03/14 01:23, , 13F
但是就算不提取, 只要原本不是指到正確的真實存在的東西,
03/14 01:23, 13F

03/14 01:24, , 14F
而且索引在範圍內, 就未定義吧
03/14 01:24, 14F

03/14 02:29, , 15F
指過去不會有事 提取才會有事
03/14 02:29, 15F

03/14 02:29, , 16F
基本上你喜歡高興愛int *i = 1234567也是可以的...
03/14 02:29, 16F

03/14 02:32, , 17F
當然int是不能賦值給pointer啦 不過 int *i = NULL;
03/14 02:32, 17F

03/14 02:32, , 18F
i += 10; 基本上都不會出事,只有在提取的時候會炸
03/14 02:32, 18F

03/14 02:33, , 19F
比方說cout << *i; 就死了
03/14 02:33, 19F

03/14 02:33, , 20F
「亂指沒關係,但是不能提取一個不該提取的位置」
03/14 02:33, 20F

03/14 02:34, , 21F
不是 undefined behavior 嗎?
03/14 02:34, 21F

03/14 02:34, , 22F
但是你單純cout << i;你會發現它指標正確的指到0x28
03/14 02:34, 22F

03/14 02:35, , 23F
undefined behavior指的是「提取不該提取的指標」
03/14 02:35, 23F

03/14 02:36, , 24F
n4296 5.7.4 這邊定義運算時只有針對陣列才有定義的樣子?
03/14 02:36, 24F

03/14 02:36, , 26F
而且運算只能在 array bounds 中, 或剛好超過一格
03/14 02:36, 26F

03/14 02:38, , 27F
maa, 你的意思是說*(aa+3)如果移動3*sizeof(aa)要是
03/14 02:38, 27F

03/14 02:38, , 28F
out of bound的話就會變成undefined嗎?
03/14 02:38, 28F

03/14 02:39, , 29F
我的認知是aa+3仍然有效 但是*(aa+3)的* (提取)是UB
03/14 02:39, 29F

03/14 02:40, , 30F
但是他說的是「指到的位置」(有點語焉不詳的感覺)
03/14 02:40, 30F

03/14 13:02, , 31F
照標準應該是 aa 跟 aa+1 合法, aa+3 是 UB
03/14 13:02, 31F

03/14 13:04, , 32F
還是我誤會了些甚麼. aa 到底是不是指標 xD
03/14 13:04, 32F

03/14 13:04, , 33F
我看到 3*sizeof(aa) 有點疑惑
03/14 13:04, 33F

03/14 13:06, , 34F
阿. 我的前提是 aa 真的要指到東西啦.. Orz
03/14 13:06, 34F

03/14 13:06, , 35F
如果 aa 有指到東西 aa+1 就合法, 但是 aa+3 不行
03/14 13:06, 35F

03/14 13:10, , 36F
但是 *(aa+1) 也是 UB
03/14 13:10, 36F

03/14 13:11, , 37F
如果 aa 是亂指的話, aa+1, aa+3 都不行. 加 * 就都不行
03/14 13:11, 37F

03/14 13:12, , 38F
剛好超過一格好像還可以XD 假設 aa 指到長度為 3
03/14 13:12, 38F

03/14 13:12, , 39F
那 aa, aa+1, aa+2, aa+3 (剛好超過一格)好像都可
03/14 13:12, 39F

03/14 13:14, , 40F
原則上就是要指到同一個陣列內或陣列後一格
03/14 13:14, 40F

03/14 13:15, , 41F
如果指向的不是陣列的話, 會當作只有一個元素的陣列
03/14 13:15, 41F

03/14 13:22, , 42F
suhorng: 我上面其實是想解釋如果指向的不在陣列內
03/14 13:22, 42F

03/14 13:23, , 43F
如果 i 是 null pointer, 那 i + 10 是未定義
03/14 13:23, 43F

03/14 13:24, , 44F
i see
03/14 13:24, 44F

03/14 13:31, , 45F
不過這個問題不已經是 FAQ 了嗎. Q_Q
03/14 13:31, 45F
文章代碼(AID): #1L0arWlN (C_and_CPP)
文章代碼(AID): #1L0arWlN (C_and_CPP)