常量的哪个属性使其不可更改?

时间:2014-02-05 17:45:43

标签: c++ c

今天我接受了一次采访,其中一个问题对我来说非常棘手。 采访者说“如何不断改变其价值?”

我回答“使用指针”,我向他展示了一个例子:

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;
}

但他说这很好。但告诉我哪个属性使得常数不变?他还说有一个属性我们可以改变并且不断改变。

有这样的财产吗?它是如何工作的?

3 个答案:

答案 0 :(得分:15)

如果他说这很好,那么他错了:尝试修改常量对象会产生不确定的行为。在实践中,可能会发生以下三种情况之一:

  • 常量变量的行为与普通对象一样,您可以看到其值的变化;
  • 它存储在不可写入的内存中,程序因访问冲突而崩溃;
  • 每次使用它都会被硬编码的值替换,并且您看不到它的变化。

该语言未定义const个对象的任何运行时属性;只是编译时检查,你不会意外修改它们。

答案 1 :(得分:3)

也许你的面试官指的是“身体”财产:

如果变量位于程序的(只读)代码段中,则任何更改它的尝试都将导致运行时异常。

例如,以下代码很可能是使用代码段中分配的字符串"abc"进行编译的:

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

任何写入该字符串的尝试都将导致运行时异常。 为了防止这种情况发生(通过生成编译时错误),您应该将str声明为const

这是一个更“现实”的例子:

我有一个为STM32(基于ARM的皮质)构建的程序。

当我通过JTAG将其加载到CPU中时,代码段被烧入EPROM,数据段被写入RAM。

代码部分包含所有代码以及所有const变量。

数据部分包括所有全局和/或静态变量。

任何将const指针转换为“常规”指针然后使用它以写入内存的尝试都会立即导致内存访问冲突,因为CPU会尝试执行RAM-Write操作进入EPROM地址。

答案 2 :(得分:0)

我认为面试官希望你说const_cast<>()可以使代码中的常量声明变量可以改变。