1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
2、堆区(heap): 一般由程序员分配释放(动态内存分配释放), 若程序员不释放,程序结束时可能由操作系统回收 。
3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。
常量区 :常量字符串就是放在这里的。 程序结束后由系统释放。
4、代码区:存放函数体的二进制代码。
全局区(常量区):
如图,运行结果很容易理解,p01,p02指向了不同的地址,并且它们所代表的字符串也不相同。
那么当char* p12 = "AAAAA1"时,p01,p02指向的地址相同吗?
根据运行结果,我们发现它们指向了相同的地址,这是为什么呢。
因为字符串是存储在全局区的,当我们定义了出现了"AAAAA1“这个常量时,它会被分配在常量区,直至程序结束时才被释放,当char p11和char p12都为"AAAAA1”时,它们p01和p02被指向内全局区的同一个地址,因此有了如图的结果。
小结:1.指针指向谁,就把谁的地址赋给指针。
2.全局区的内存在程序结束后才释放。
3.如果字符串常量相同,那么使用这个字符串常量时,会指向同一个地址。
如下代码:
#include <stdio.h>
char* getStr1()
{
char* p11 = "AAAAA1";
return p11;
}
char* getStr2()
{
char* p12 = "AAAAA1";
return p12;
}
int main()
{
char* p01 = NULL;
char* p02 = NULL;
p01 = getStr1();
p02 = getStr2();
printf("%p %p %s %s\n", p01,p02,p01,p02);
p01 = "BBBBB1";
printf("%p %p %s %s\n", p01, p02, p01, p02);
system("pause");
return 0;
}
当我们在重新给p01赋值为"BBBBB1"时,全局区又会重新分配一块新的内存用于存储"BBBBB1",然后将其地址指向p01.