c - 函数中声明的 const 变量的堆栈中是否有只读内存?

标签 c memory constants

我知道全局常量存储在 .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/

相关文章:

c - (null) 在打印字符串时正在打印

c - 套接字超时实现

windows - 什么是工作集?

c - 我应该释放使用字符串文字初始化的 char* 吗?

java:超出内存限制?

c++ - Boost 点 C++ 的初始化

c - const char * const 和 const char [] 有区别吗?

c - 尝试找出在为数组分配的堆内存中分配值期间的错误

戈朗 : declare a single constant

java - Java对象数组是如何使用的?