看板 C_and_CPP 關於我們 聯絡資訊
如題,一個簡單的小程式如下: #include<stdio.h> #include<stdlib.h> int main() { const int score = 59; int *ptr; ptr = (int *)&score; printf("1. %d %d\n",score,*ptr); printf("2. %p %p\n",&score,ptr); (*ptr) = 100; printf("3. %p %p\n",&score,ptr); printf("4. %d %d\n",score,*ptr); system("pause"); return 1; } 結果: 1. 59 59 2. 002DFCD4 002DFCD4 3. 002DFCD4 002DFCD4 4. 59 100 這是怎麼一回事呢? 指標位置跟score的位置顯示是相同記憶體位置, 但是卻會允許ptr改值? 且ptr指的值還可以跟score不一樣? 請各位不吝指點! 感謝各路英雄好漢!謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.144.17
LPH66:compiler 應該會在 ptr = (int *)&score; 那行給 warning... 01/13 20:10
ericinttu:這樣用pointer, 是個白目者吧... 01/13 20:11
kiedveian:你把const int * 轉型成 int * 所以可以改 01/13 20:23
awashharp:這小黃不是有教嗎XD? 01/13 20:38
nowar100:我沒記錯的話這應該是未定義行為吧 01/13 20:50
tropical72:vc上跑是連警告都沒有,結果一樣,在其它地方有相關討論 01/13 21:12
tropical72:http://0rz.tw/GWHhm 不過用watch下去看,source是真的 01/13 21:13
tropical72:被改成59.. 01/13 21:13
tropical72:說錯,score 是真的被改成 100 01/13 21:15
ericinttu:這有在十三誡裡面嗎? 01/13 22:33
HudsonE:因為被你強轉了 (int*) 那行 01/13 22:36
winest:猜測是const只是在compiler時檢查,因為data段還是rw 01/13 22:41
tomap41017:推樓樓上...建議用C++ style cast就知道了 01/14 01:25
hylkevin:應該是compiler幫你最佳化成常數了吧 試試-O0 01/14 01:28
loveme00835:未定義行為, 參考 5.2.11.7, 發生什麼事是不可預測的 01/14 01:31
kkroy:OK了解! 感謝大家! 原來是未定義.... 01/14 09:30
kkroy:To awashharp: 實在慚愧~小黃的功力我吸收不到一半QQ 01/14 09:31
pi3141:好眼熟的程式碼XDD talk板有相同的結論了^_^ 01/14 15:04
jmren:小黃是?可以給個提示XD? 01/18 12:08