C/C++编译的程序占用的内存分为以下几个部分
1、栈
局部变量,C语言里面const 修饰的局部变量(有只读属性)
2、堆
动态内存(malloc、new)
3、全局数据区(静态存储区)
全局变量、
C语言里面static修饰的局部变量(作用区域没变,只是寿命变长)、
C语言里面static修饰的全局变量(不能被外接文件访问)、
C语言里面老款编译器把const修饰的全局变量放在全局数据区(bcc编译器)
4、只读存储区(文字常量区)
字符串常量、
C语言里面新款编译器把const修饰的全局变量放在只读存储区(gcc、VC)、
全局生命周期的只读变量的值:static const int i
在C++里面,常量定义必须初始化,对于局部对象,常量存放在栈上;对于全局对象,常量存放在全局数据区(静态存储区);对于字符串常量,存放在只读存储区。
提出问题:为什么两行代码都很类似但是第二行是代表的是字符串常量?
char ss[] = "Hello,World!";
char *str = "Hello,World!";
解答:双引号里面的字符串其实都是字符串常量,但是第一句 "Hello,World!"其实就代表一个数组,只不过这个数组是常量,它表达的意思就是数组给另一个数组初始化,相当于就是值的赋值,所以第一句的本质就是一个字符数组的初始化。
而第二句就是是一个指针指向字符串常量,代表字符串常量的地址,是不能被修改的。