博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内存四区中全局区见解
阅读量:5873 次
发布时间:2019-06-19

本文共 1715 字,大约阅读时间需要 5 分钟。

  今天我把自己对于内存四区中全局区见解写出来,希望可以帮到大家,同时也希望指出我的不正!

  可能有些人不解,我不是想通过,内存四区引入指针么?怎么上来就用指针?

  这一点我要说明一下,我用指针是为了更清楚的表明我对于内存四区的见解,是想让大家明白,内存四区是什么?栈区,堆区和全局区之间的关系!

  正如同在栈区和在堆区分配的内存空间是不同的!指针里存的是地址,地址是哪里的地址?是内存上的地址!而如果我们分不清我们的指针到底指向的是哪一个区域的地址,调用起来岂不是很麻烦。比如我们在子函数上分配了一个变量(栈区),我们将指针指向这个变量,在主函数中读取出来的则是一段乱码!但是我们今天先不说这个,先谈一下全局区。

  全局区

  例如在主函数中定义的变量可在子函数中调用(可称为全局变量),但子函数中定义的变量不可以在主函数中调用,除非是子函数将内存地址指向全局区可在主函数中调用;

  我们先看一个例子:

  

  #include <stdio.h>

  #include <string.h>

  #include <stdlib.h> 

  char *distribution(in c)

{
  char *a = NULL;
  char b[] = "abcd";//在栈区分配的内存空间

  char d[] = "abcd';//在栈区分配的内存空间

  a = b;

  printf("&b:%d,&c:%d\n",&b,&c);//地址不同

  printf("%d\n",c);//成功打印 10

  return a;

}

  int main()
{
  char *a = NULL;

  int b = 10;//栈区分配 可称为全局变量

  a = distribution(b);//用a接受返回的地址

  printf("%s\n",a);//打印字符串,是一堆乱码

  system("pause");

  return 0;
}

  我们发现在 主函数中 栈区上分配的变量 可以 在子函数中调用,而子函数中 栈区上 分配的字符串却无法在主函数上调用

  我们再看第二个例子:

  

  #include <stdio.h>

  #include <string.h>

  #include <stdlib.h>

  int a1 = 10;//全局变量

  static int a2 = 20;//静态全局变量

  

  char*distribution();

  int main()

{

  char*a = NULL ;

  char*b ="abcd";//我们将*b指向一个字符串,而"abcd"分布在全局区

  a = distribution();//用a接受传回来的地址;

  printf("%s\n",a);//字符串成功打印出来

  printf("a = %d,b = %d\n",a,b);//因为指针是指向地址,所以打印出来的是地址;当加上 * 时,则是向地址里取出值;

  //打印之后我们发现两个地址是一样的

  return 0;  

}

char*distribution()

{

  char*c = "abcd";//这里我们将c也指向一个"abcd",同样“abcd”也是全局变量

  return c;//这里返回的是指针指向的地址

}

  通过以上两个例子我们可以发现:同样是在子函数中,栈区所分配的内存空间无法传递到主函数中,而全局区的却可以;

  在栈区中分配相同字符串时,打印出来的两个地址不同。而且当我们将指针指向全局区同样的字符串时,打印出的地址却一样;

  那么可以这样认为,在栈区上分配的内存空间在主函数上不会自动析构(程序未运行完之前),而在子函数中会被析构掉(子函数运行完之后),

  在全局区上时, 只要分配了空间,就不会被自动析构掉,而且为了节省内存资源,当我们多次调用它时,它不会再次分配内存空间。

转载于:https://www.cnblogs.com/huhaihao/p/7538558.html

你可能感兴趣的文章