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)

栈 :通常是指用来存放程序中 用户临时创建的局部变量、函数形参、数组(局部变量未初始化则默认为垃圾值)

 

posted @ 2019-02-15 22:28  寒江小筑  阅读(1039)  评论(0编辑  收藏  举报