c语言----与const常量有关的内存分配

这篇文章时对c内存分配的一些思考,主要解释以下几点问题:

1. const 是不是存放在常量区中???

2. 全局变量与常量区的关系???

3. 为什么指针可以改变局部const数组内容而不能改变其局部const的内容???

 

基础知识:
          1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
          2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
          3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的
                全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另
                一块区域。 - 程序结束后由系统释放。
          4、文字常量区 —一般常量就是放在这里的。不能被修改。 程序结束后由系统释放
          5、程序代码区—存放函数体的二进制代码。

着重讲下const 是不是存放在常量区里???。

对于局部的const 非static常量,不放在常量区里。而全局的const 放在常量区里。

全局const:

     如果const用在全局或者使用了static关键字,例如extern const int i=10,static const int i=10。那么这个i就是一个常量(网上有人说真正意义上的常量),并且该常量是存放在.rodata段的---Read Only Data也就是常量区,是无法通过取地址方式去修改的(具体情况见情况2),修改内容会报段错误。所以我认为常量区是全局变量中.rodata段。

 

局部const(不包括局部const数组

       如果const用在局部并且没有使用static关键字(例如在main函数里面const int i=10*2+1),且

               a. 赋值是常量表达式(没有其它变量或者需要外界输入的值);

               b.不对该常量进行一些取地址类似的操作(&),

满足上述条件,那么就不会对其分配内存空间。仅仅是将其放在符号表(符号表解释)中否则,就会将其内容拷贝一份,并为其拷贝内容分配空间,而且这个空间是在栈上的-----常量折叠。这就可以解释如果我们将局部const赋值给指针后,强制类型转换为非const,我们就可以修改其内容了。因为我们操作的是栈而不是常量区。

下面试验下:

c语言----与const常量有关的内存分配_第1张图片

c语言----与const常量有关的内存分配_第2张图片

指针只拿到了其在栈中拷贝空间的地址,所以没有发修改i的值。但是我们下面这样就会报错:

因为其存放在常量区。

 局部const数组由于可能占据内存较大,直接分配栈空间,

最后总结下:局部const 从功能的角度,我们可以将其看做普通的局部变量。

你可能感兴趣的:(C/C++语言)