首頁>Program>source

我在代碼中寫了一些類似的东西

const int x=1;
int *ptr;
ptr = &x;
*ptr = 2;

這對所有編譯器都有效吗? 為什麼GCC編譯器没有註意到我们正在更改常量變數?

最新回復
  • 6月前
    1 #

    const 實際上並不意味着"恒定". C語言中"恒定"的值具有在編譯時確定的值.字面的 42 是一个例子.維兹威兹 關鍵字確實意味着只讀.考虑例如:

    const
    

    const int r = rand();的value 直到程式執行時間才確定,但是 r 關鍵字表示您不允许修改 const 初始化之後。

    在您的代碼中:

    r
    

    任務 const int x=1; int *ptr; ptr = &x; *ptr = 2;約束违反,表示需要合格的編譯器来投诉; 您不能合法地分配 ptr = &x; (指向const int的指標)非常量 const int*的值 目的.如果編譯器生成可執行檔案(它不需要這樣做;它可以拒绝它),那麼行為不是由C標準定義的。

    例如,生成的代碼實際上可能儲存值 int*2 -但後来提到了 x 可能会产生值 x ,因為編譯器知道那个 1 初始化後不能被修改.它知道,因為您是這樣說的,通過定義 x 作為 x .如果您對編譯器撒谎,後果可能会很糟。

    實際上,最糟糕的事情是该程式的行為符合您的預期; 這意味着您有一个很难檢測到的錯誤. (但是您應该获得的诊斷將是一个很大的線索。)

  • 6月前
    2 #

    線上C 2011草案:

    const

    已添加重點.

    由於未定義行為,因此不需要編譯器發出诊斷資訊,也不需要停止翻译.在一般情况下,這很难理解; 假設您有一个類似

    的函式

    6.7.3 Type qualifiers

    ...
    6If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined. If an attempt is made to refer to an object defined with a volatile-qualified type through use of an lvalue with non-volatile-qualified type, the behavior is undefined.133)
    133) This applies to those objects that behave as if they were defined with qualified types, even if they are never actually defined as objects in the program (such as an object at a memory-mapped input/output address).

    在其自己的独立翻译單元中定義.在翻译過程中,編譯器無法知道 void foo( int *p ) { *p = ...; } 可能指向一个 p 是否合格的物件.如果您打来的電话是

    const
    

    可能会收到類似 const int x; foo( &x );的警告 或類似的照明.

    還要註意, parameter 1 of 'foo' discards qualifiers 限定符不一定意味着相關聯的變數將儲存在只讀儲存器中,因此上述代碼可能会"起作用"(更新 const中的值 ),因為您可以成功更新 x 通過绕着 x进行最终執行 語義.但是您最好不要宣告 const 成為 x .

  • 6月前
    3 #

    錯誤的程式員.没有月饼!

    如果需要修改const,請將其複製到非const變數,然後使用它.這是常量,這是有原因的.試圖在const週圍"潜行"会匯致嚴重的執行時問题.即優化程式可能已使用內聯值等。

    const
    

  • 6月前
    4 #

    這裏有一个很好的讨論:evil的編譯器会败壞evil的演員吗?

    我希望gcc可以編譯它,因為:

    const int x=1; int non_const_x = x; non_const_x = 2;

    它是否起作用,將取決於代碼的編譯方式,為選定的編譯選項實現const的方式以及目標CPU和體系結構.它可能会起作用.否則可能会崩潰.否則,您可能会寫一些"隨機"的記憶體,並匯致(或不引起)某種怪異的效果.這不是一个好的編碼策略,但這不是您的問题:-)

      ptr is allowed to point to x, otherwise reading it would be impossible, although as the comment below says it's not exactly brilliant code and the compiler should complain. Warning options will (I guess) affect whether or not it's actually warned about.

      when you write to x, the compiler no longer "knows" that it is writing to a const, all this is in the coders hands in C. However, it does really know, so it may well warn you, depending on the warning options you've selected.

  • c:scanf(或)printf中的格式說明符錯誤
  • c#:如何為移動設備iOS / Android統一加快構建和執行過程