2013-03-31 81 views
2

運行下面的程序後:能夠常量指針更改值

gcc -c volVars.c -o volv 

./volv 

它編譯。

#include<stdio.h> 
void main(){ 
    printf("study of volatile pointers\n"); 
    const int lConstInt=6; 
    printf("\n const int is %d\n",lConstInt); 
    volatile const int *lvcint=&lConstInt; 
    printf("volatile const int after assignment = %d\n",*lvcint); 
    //*lvcint=*lvcint+1; uncommenting this gives compilation error 
    int *track = lvcint; 
    *track = *track + 1; 
    printf("modified the lcoation = %d\n",*track); 
} 

如果我取消註釋lvcint=*lvcint+1;行它給出了預期的錯誤。但如果我使用非const的軌道引用指針(lvcint),我可以修改其內容。我在該行發出警告,但最終我能夠修改只讀位置的內容。 gcc中是否有任何錯誤或者我缺少某些東西。

+2

不錯閱讀:[如何改變C++中的變量的常量?](http://stackoverflow.com/questions/13618706/how-to-change-the-constness-of-a-variable-in- c) –

+3

每個人都需要注意編譯器的警告。 –

+0

符合C編譯器只有在違反規則時才被迫發出「診斷」。你說你看到一個警告,那麼這是你的錯,不要忽視這個警告。 –

回答

0

粗略地說,const關鍵字(僅)是一個很好的習慣,它可能會阻止一些潛在的錯誤,並且可能會觸發更好的編譯優化。

但它實際上並不保護變量,就像權限位一樣。

有時,編譯器可能會在二進制文件的只讀段中放置常量變量,寫入它們會觸發異常,如無效內存訪問,但不能依賴此。

0

這不是gcc中的錯誤,它在這種情況下會發出警告,並且您應該始終注意警告。

更改const變量的值會生成未定義的行爲,它基於標準意味着您無法知道將會發生什麼。它可能在不同的機器,編譯器,程序或系統的狀態,月亮的各個階段上完全不同。 通常,開發人員需要遠離未定義的行爲,編譯器無法找出所有可能的情況併發出錯誤。在Linux下

0

,我得到以下警告:

warning: initialization discards ‘const volatile’ qualifier from pointer target type [enabled by default]

我想這意味着,編譯器實際上消除了常量預選賽和正常初始化它們。我不能肯定地說,但這是我最好的猜測,因爲此代碼拒絕在Windows下的GCC中進行編譯。我在Windows中收到以下錯誤:

"error: invalid conversion from 'const volatile int*' to 'int*'

所以是的,我不得不猜測代碼是由編譯器修改的。

至於爲什麼你註釋掉的那一行會導致一個錯誤,這是因爲你不能修改一個常量(以及你不應該能夠)。

來源:我自己的實驗。