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.

最后修改:2019 年 02 月 26 日
如果觉得我的文章对你有用,请随意赞赏