2014-02-05 41 views
5

今天我遇到了一個面試,其中一個問題對我來說非常棘手。採訪者說:「如何不斷改變其價值?」哪個常數的屬性使其不可變更?

我回答說:「使用指針」,我給他看了一個例子:

int main(void) 
{ 

     const int a = 3; 
     int *ptr; 
     ptr = (int*)(&a); 

     printf("A=%d\n", a); 
     *ptr = 5; 
     printf("A=%d\n", a); 


     return 0; 
} 

但他說,這是好的。但告訴我哪些屬性可以使得恆定不變?他還說有一個屬性我們可以改變並且不斷變化。

有沒有這樣的屬性?它是如何工作的?

+0

屬性'const'? – djechlin

+10

我想他想聽到你的'可變'。但他的問題是無稽之談,他對你的代碼的迴應更是無稽之談! – Nawaz

+0

聽起來像C#或C++/cli –

回答

15

如果他說這很好,那麼他錯了:試圖修改一個常量對象給出未定義的行爲。實際上,可能發生以下三種情況之一:

  • 常量變量的行爲與普通對象類似,您會看到它的值發生變化;
  • 它存儲在不可寫的內存中,並且程序因訪問衝突而崩潰;
  • 它的每一次使用都被一個硬編碼的值所取代,而你沒有看到它的改變。

該語言沒有定義const對象的任何運行時屬性;只是編譯時檢查你是否不小心修改它們。

+1

這些行爲的混合可能發生。給定'const int a = 1; f(&a); g(a); h(&a);)其中'f'改變指向它的對象,編譯器可能優化'g(a)'到'g(1)',導致'g'作用就好像「a」是1,而「h」就好像它具有已更改的值一樣。 –

3

也許你的面試官指的是「物理」屬性:

如果變量位於(只讀)程序的代碼段,那麼任何試圖改變會導致與運行時異常。

例如,下面的代碼段將最有可能與該代碼段分配的字符串​​編譯:

char* str = "abc"; 
str[1] = 'x'; 

任何試圖寫入該字符串將導致一個運行時異常。 爲了防止發生這種情況(改爲生成編譯時錯誤),您應該聲明strconst

這裏是一個更「現實生活」的例子:

我已經有了一個STM32內置程序(基於ARM的皮質)。

當我通過JTAG將它加載到CPU時,代碼段被燒錄到EPROM中,並且數據段被寫入到RAM中。

代碼部分包含所有代碼以及所有const變量。

數據部分包含所有全局變量和/或靜態變量。

任何企圖一const指針轉換爲「普通」指針,然後才能用它來寫入內存,立即導致內存訪問衝突,因爲CPU嘗試執行RAM寫入操作到EPROM地址。

0

我認爲面試官希望你說const_cast <>(),它可以使一個常量聲明變量在代碼中變化。

+0

如果該變量最初被聲明爲const,則不會。 – olevegard

相關問題