有下面一段測試程式:(測試環境gcc4.8.4, ubuntu14.04)
輸出如下:
可以看出pa+2的值和c的地址是完全一樣的,透過*(pa+1)=12的賦值也確實改變了b的值,但是*(pa+2)=13的賦值卻沒能改變c的值。 反彙編後:
*(pa+1)能訪問到b,*(pa+2)能訪問到c,從*(pa+1) = 12; *(pa+2) = 13;兩句的彙編程式碼看,兩者並無區別,但是從printf("a:%d b:%d c:%d\n", a,b,c);和int k1=c;int k2=b;看對b,c的操作有明顯區別,在輸出c的時候,編譯器永遠會把c的初值賦值給ecx,可能是為了後面的printf,k1=c的賦值也永遠是把c的初值賦值給了k1,但是k2=b確是重新將b的值賦值給k2.個人猜想gcc在處理const作用的區域性變數的時候,雖然該變數有地址,但是使用該變數的時候確是永遠使用該變數的初始化值,而不會重新取值。對於全域性變數中const作用的變數,gcc會將該變數寫入只讀資料段,如果像上述一樣去嘗試修改m,n的值會出現Segmentation fault。
有下面一段測試程式:(測試環境gcc4.8.4, ubuntu14.04)
輸出如下:
可以看出pa+2的值和c的地址是完全一樣的,透過*(pa+1)=12的賦值也確實改變了b的值,但是*(pa+2)=13的賦值卻沒能改變c的值。 反彙編後:
*(pa+1)能訪問到b,*(pa+2)能訪問到c,從*(pa+1) = 12; *(pa+2) = 13;兩句的彙編程式碼看,兩者並無區別,但是從printf("a:%d b:%d c:%d\n", a,b,c);和int k1=c;int k2=b;看對b,c的操作有明顯區別,在輸出c的時候,編譯器永遠會把c的初值賦值給ecx,可能是為了後面的printf,k1=c的賦值也永遠是把c的初值賦值給了k1,但是k2=b確是重新將b的值賦值給k2.個人猜想gcc在處理const作用的區域性變數的時候,雖然該變數有地址,但是使用該變數的時候確是永遠使用該變數的初始化值,而不會重新取值。對於全域性變數中const作用的變數,gcc會將該變數寫入只讀資料段,如果像上述一樣去嘗試修改m,n的值會出現Segmentation fault。