C++——代码运行过程详解
#include <iostream> using namespace std; int a = 0;//初始化的全局变量:保存在数据段 char *p1;//未初始化的全局变量:保存在BSS段 int main() { int b;//未初始化的局部变量:保存在栈上 char s[] = "abc";//"abc"为字符串常量保存在常量区;数组保存在栈上, 并将常量区的"abc\0"复制到该数组中。这个数组可以随意修改而不会有任何隐患, 而"123"这个字符串依然会保留在静态区中。 char *p2;//p2保存在栈上 char *p3 = "123456";//p3保存在栈上,"123456\0"保存在data区的read-only部分 //注意:如果令p3[1] = 9; 则程序崩溃,指针可以访问但不允许改变常量区的内容 //声明了一个指针p3并指向"123456\0"在静态区中的地址,事实上,p3应该声明为 char const *,以免可以通过p3[i]='\n'这一类的语法去修改这个字符串的内容。如果这样 做了,在支持“常量区”的系统中可能会导致异常,在“合并相同字符串”的编译方法下会导致其它 地方的字符串常量古怪地发生变化。 static int c = 0;//初始化的静态局部变量:保存在数据区(数据段) p1 = (char *)malloc(sizeof(char) * 10);//分配的10字节区域保存在堆上 p2 = (char *)malloc(sizeof(char) * 20);//分配的20字节区域保存在堆上 strcpy(p1, "123456"); //"123456\0"放在常量区,编译器可能会将它与p3所指向"123456"优化成一个地方 return 0; }
BSS段 :通常是指用来存放程序中 未初始化的全局变量、静态变量(全局变量未初始化时默认为0)的一块内存区域
数据段 :通常是指用来存放程序中 初始化后的全局变量和静态变量
代码段 :通常是指用来存放程序中 代码和常量
堆 :通常是指用来存放程序中 进程运行时被动态分配的内存段 ( 动态分配:malloc / new,者动态释放:free / delete)
栈 :通常是指用来存放程序中 用户临时创建的局部变量、函数形参、数组(局部变量未初始化则默认为垃圾值)