我知道全局常量存储在 .rodata 中
此外,我知道在函数中声明的变量存储在堆栈中。但是,由于 const 应该是只读的,堆栈中是否有专门的部分供他们使用?如何控制对它们的访问?
最佳答案
你真正应该知道的是:如果一个对象被声明为 const,编译器将不会轻易让你尝试修改它,如果你绕过编译器,那么任何修改对象的尝试都是未定义的行为。就是这样。没有其他的。忘掉 .rodata 或您学到的任何东西,重要的是尝试修改 const 对象是未定义的行为。
我的意思是“编译器不允许你”并绕过它:
const int x = 5;
x = 6; // Not allowed by compiler
int* p = &x; *p = 6; // Not allowed by compiler
int* p = (int*)&x; *p = 6; // Allowed by compiler, undefined behaviour.
执行最后一条语句可能会崩溃,或将 x 更改为 6,或将 x 更改为 999,或保持 x 不变,或使其表现得异常,有时为 5,有时为 6,包括 x == x 为假。
关于c - 函数中声明的 const 变量的堆栈中是否有只读内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37080237/