內存四區中全局區見解
今天我把自己對於內存四區中全局區見解寫出來,希望可以幫到大家,同時也希望指出我的不正!
可能有些人不解,我不是想通過,內存四區引入指針麽?怎麽上來就用指針?
這一點我要說明一下,我用指針是為了更清楚的表明我對於內存四區的見解,是想讓大家明白,內存四區是什麽?棧區,堆區和全局區之間的關系!
正如同在棧區和在堆區分配的內存空間是不同的!指針裏存的是地址,地址是哪裏的地址?是內存上的地址!而如果我們分不清我們的指針到底指向的是哪一個區域的地址,調用起來豈不是很麻煩。比如我們在子函數上分配了一個變量(棧區),我們將指針指向這個變量,在主函數中讀取出來的則是一段亂碼!但是我們今天先不說這個,先談一下全局區。
全局區
例如在主函數中定義的變量可在子函數中調用(可稱為全局變量),但子函數中定義的變量不可以在主函數中調用,除非是子函數將內存地址指向全局區可在主函數中調用;
我們先看一個例子:
#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;//這裏返回的是指針指向的地址
}
通過以上兩個例子我們可以發現:同樣是在子函數中,棧區所分配的內存空間無法傳遞到主函數中,而全局區的卻可以;
在棧區中分配相同字符串時,打印出來的兩個地址不同。而且當我們將指針指向全局區同樣的字符串時,打印出的地址卻一樣;
那麽可以這樣認為,在棧區上分配的內存空間在主函數上不會自動析構(程序未運行完之前),而在子函數中會被析構掉(子函數運行完之後),
在全局區上時, 只要分配了空間,就不會被自動析構掉,而且為了節省內存資源,當我們多次調用它時,它不會再次分配內存空間。
內存四區中全局區見解