通过非const指针修改const int

时间:2015-05-08 07:20:11

标签: c pointers const

#include <stdio.h>

int main(){
    const int a = 10;
    *(int*)(&a) = 9; // modify a
    printf("%d", a);
    return 0;
}
  • 当我在Xcode上运行此代码时,输​​出为10(未更改)
  • 当我在Visual Studio社区上运行此代码时,输​​出为9(已更改)

为什么?

3 个答案:

答案 0 :(得分:8)

此程序将进行编译,但会显示未定义的行为,可能会输出910或其他内容,或者可能会崩溃谁知道。

当您说aconst时,您承诺您不会尝试直接或间接更改a的值,并且编译器可能会做出某些假设。如果你违背诺言,可能会发生意想不到的事情。

答案 1 :(得分:5)

  

问:为什么?

答案:undefined behaviour

要解释一下,如果您尝试通过某个<xsl:choose> <!-- if decimal, do not add quotes --> <xsl:when test=". castable as xs:decimal"> <xsl:value-of select="."/> </xsl:when> <!-- if boolean, do not add quotes --> <xsl:when test=". castable as xs:boolean"> <xsl:value-of select="."/> </xsl:when> <xsl:otherwise> <xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text> </xsl:otherwise> </xsl:choose> 指针访问来修改function chl(){ var name= document.getElementByID('name').value; $.ajax({ type:"post", url:"hi.php", data:{name:name}, success: function(html){ alert ("success"); } }); return false; } 变量值,则会调用undefined behaviour

根据const标准,第6.7.3章,第6段。

  

如果尝试通过使用具有非const限定类型的左值来修改使用const限定类型定义的对象,则行为未定义。

注意:non-const的推荐签名为C11

答案 2 :(得分:0)

const关键字用于不更改变量的值。如果强行完成结果可能会出乎意料