首先,程序变量的内存空间有五个:堆栈区(栈区)、堆区、全局区(静态区)、代码区、文字常量区
1、堆栈区(栈区)
堆栈区是一种老的叫法,由于堆栈区的操作方式和数据结构中的栈是类似(数据先进后出的结构),所以后面很多在称堆栈区的时候直接叫做栈区,所以其实堆栈区和栈区是一个意思。 堆栈区是又编译器自动分配和释放的,存放的内容是一些局部变量和函数的参数等。
2、堆区
堆区是自己申请的内存空间,C中使用malloc 来进行申请使用,使用delete来进行释放,C++中使用new/free来进行申请和释放,其实就是说只有自己去申请的变量才会存再堆区中。
3、全局区
全局区也叫静态区,非常好理解,在函数外的全局变量的数据存放区域,细化的又分为全局初始化区和全局未初始化区,即根据全局变量有没有进行初始化进行分类。
4、代码区
非常直观的可以理解为存放代码的二进制数据的区域,这里可以衍生一下内联函数为什么会需要更多的内存空间,因为内联函数会将使用到其自身的地方都进行展开,所以其实增加了代码区的内存使用。
5、文字常量区
文字常量区即存放一些const申明的变量或者字符串常量等
即如果在函数中有 char *p = "abcd"; //p存储在堆栈区、 “abcd\0”就是存储在常量区的
注意:
在文字常量区的数据是只读的,不能对其进行修改,常见的错误是关于野指针的:
char *p = "hello world"; // hellow world 是存储在常量区的字符串
*(p+1) = 'w'; //会导致程序崩溃
printf("the p is: %s \n",p);
下面是一个经典的例子:
- int a = 0; //全局初始化区