[問題] 宣告const的變數不是不能改值嗎?

看板C_and_CPP作者 (☆㊣↖煞氣ㄟ阿喂↘ξ★)時間15年前 (2011/01/13 19:48), 編輯推噓11(1108)
留言19則, 14人參與, 最新討論串1/1
如題,一個簡單的小程式如下: #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

01/13 20:10, , 1F
compiler 應該會在 ptr = (int *)&score; 那行給 warning...
01/13 20:10, 1F

01/13 20:11, , 2F
這樣用pointer, 是個白目者吧...
01/13 20:11, 2F

01/13 20:23, , 3F
你把const int * 轉型成 int * 所以可以改
01/13 20:23, 3F

01/13 20:38, , 4F
這小黃不是有教嗎XD?
01/13 20:38, 4F

01/13 20:50, , 5F
我沒記錯的話這應該是未定義行為吧
01/13 20:50, 5F

01/13 21:12, , 6F
vc上跑是連警告都沒有,結果一樣,在其它地方有相關討論
01/13 21:12, 6F

01/13 21:13, , 7F
http://0rz.tw/GWHhm 不過用watch下去看,source是真的
01/13 21:13, 7F

01/13 21:13, , 8F
被改成59..
01/13 21:13, 8F

01/13 21:15, , 9F
說錯,score 是真的被改成 100
01/13 21:15, 9F

01/13 22:33, , 10F
這有在十三誡裡面嗎?
01/13 22:33, 10F

01/13 22:36, , 11F
因為被你強轉了 (int*) 那行
01/13 22:36, 11F

01/13 22:41, , 12F
猜測是const只是在compiler時檢查,因為data段還是rw
01/13 22:41, 12F

01/14 01:25, , 13F
推樓樓上...建議用C++ style cast就知道了
01/14 01:25, 13F

01/14 01:28, , 14F
應該是compiler幫你最佳化成常數了吧 試試-O0
01/14 01:28, 14F

01/14 01:31, , 15F
未定義行為, 參考 5.2.11.7, 發生什麼事是不可預測的
01/14 01:31, 15F

01/14 09:30, , 16F
OK了解! 感謝大家! 原來是未定義....
01/14 09:30, 16F

01/14 09:31, , 17F
To awashharp: 實在慚愧~小黃的功力我吸收不到一半QQ
01/14 09:31, 17F

01/14 15:04, , 18F
好眼熟的程式碼XDD talk板有相同的結論了^_^
01/14 15:04, 18F

01/18 12:08, , 19F
小黃是?可以給個提示XD?
01/18 12:08, 19F
文章代碼(AID): #1DBkPv-8 (C_and_CPP)