今天我把自己对于内存四区中全局区见解写出来,希望可以帮到大家,同时也希望指出我的不正!
可能有些人不解,我不是想通过,内存四区引入指针么?怎么上来就用指针?
这一点我要说明一下,我用指针是为了更清楚的表明我对于内存四区的见解,是想让大家明白,内存四区是什么?栈区,堆区和全局区之间的关系!
正如同在栈区和在堆区分配的内存空间是不同的!指针里存的是地址,地址是哪里的地址?是内存上的地址!而如果我们分不清我们的指针到底指向的是哪一个区域的地址,调用起来岂不是很麻烦。比如我们在子函数上分配了一个变量(栈区),我们将指针指向这个变量,在主函数中读取出来的则是一段乱码!但是我们今天先不说这个,先谈一下全局区。
全局区
例如在主函数中定义的变量可在子函数中调用(可称为全局变量),但子函数中定义的变量不可以在主函数中调用,除非是子函数将内存地址指向全局区可在主函数中调用;
我们先看一个例子:
#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;//这里返回的是指针指向的地址
}
通过以上两个例子我们可以发现:同样是在子函数中,栈区所分配的内存空间无法传递到主函数中,而全局区的却可以;
在栈区中分配相同字符串时,打印出来的两个地址不同。而且当我们将指针指向全局区同样的字符串时,打印出的地址却一样;
那么可以这样认为,在栈区上分配的内存空间在主函数上不会自动析构(程序未运行完之前),而在子函数中会被析构掉(子函数运行完之后),
在全局区上时, 只要分配了空间,就不会被自动析构掉,而且为了节省内存资源,当我们多次调用它时,它不会再次分配内存空间。