程序运行时操作系统把磁盘的代码load到内存,然后分配给该进程一个内存空间,分为堆区,栈区,全局区和代码区如图1所示。操作系统找到main函数开始执行程序。
图1 内存模型
代码区:存放程序的二进制代码
全局区:全局变量和静态变量。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一个区域。
栈区(static):由编译器自动分配和释放,存放函数的参数值,局部变量值等。
堆区(heap):一般有程序员分配和释放。如果程序员不释放,在程序结束时可能有操作系统回收。
char* func()
{
char* p = "abcddddddddddddddddd"; //p为一个char指针,在stack区,"abc"在常量区,
char* c1 = NULL; //p在statck
c1 = (char*)malloc(20*sizeof(char)); //给q分配了20个char大小的空间
strcpy_s(c1, sizeof("hehehe") ,"hehehe"); //先在常量区分配一个"hehehe",然后拷贝到heap区
char c2[] = "eeeeeeeee11111"; //c2存放在stact,因为其由系统分配
/*修改测试:
//c1是自己分配的,在heap区,可以修改
//c2由系统分配,在statck区,可以修改
//p指向的是常量区,不能修改
c2[5] = 'c'; //ok
c1[5] = 'c'; //ok
p[5] = 'c'; //error
*/
printf("%X %X %s\n", &p, &("abcddddddddddddddddd"), p);
printf("%X %X %s\n", &c1, c1, c1);
printf("%X %X %s\n", &c2, c2, c2);
/*
p,c1,c2都在stack, "abcddddddddddddddddd"在常量区,c1存放的内容在heap区
3DFB58 EC6BE0 abcddddddddddddddddd
3DFB4C 771238 hehehe
3DFB34 3DFB34 eeeeeeeee11111
*/
return c1;
}