【发布时间】:2017-08-22 16:18:35
【问题描述】:
在下面的示例中,“ptr”指向常量变量“local”。为什么通过分配'*ptr'修改'local'不会改变'local'的值?
#include <stdio.h>
int main(void)
{
const int local = 10;
int *ptr = (int*) &local;
printf("address of local: %p \n", &local);
printf("value of ptr: %p \n", ptr);
printf("Initial value of local : %d \n", local);
printf("Initial value of *ptr : %d \n", *ptr);
*ptr = 100;
//*((int*)&local) = 1000;
printf("Modified value of local: %d \n", local);
printf("Modified value of *ptr: %d \n", *ptr);
printf("address of local: %p \n", &local);
printf("value of ptr: %p \n", &(*ptr));
return 0;
}
输出:
address of local: 0x7ffd946bd9c4
value of ptr: 0x7ffd946bd9c4
Initial value of local : 10
Initial value of *ptr : 10
Modified value of local: 10
Modified value of *ptr: 100
address of local: 0x7ffd946bd9c4
value of ptr: 0x7ffd946bd9c4
【问题讨论】:
-
因为丢弃顶级
const对象的const是未定义的行为。 -
@nwp 实际上,这并不完全正确,演员表本身不是 UB。实际修改的只有UB。一般来说,C++ 中的指针强制转换很少会直接导致 UB(我确信有例外)。它通常是 UB 的错误转换指针的 用法。
-
如果你说某个东西是 const,它取决于编译器如何处理它。据你所知,它被放在只读存储器的某个地方,因为你说过你不会改变它。现在你正在尝试编辑它。你为什么希望它改变?
-
const 在很多情况下根本就没有地址(直接值 10 用于机器码)
-
谢谢大家:)。现在我明白了。