今天我接受了一次采访,其中一个问题对我来说非常棘手。 采访者说“如何不断改变其价值?”
我回答“使用指针”,我向他展示了一个例子:
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 :(得分: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<>()可以使代码中的常量声明变量可以改变。