1. 程式人生 > >內存四區中全局區見解

內存四區中全局區見解

麻煩 現在 printf char* 相同字符 一段 空間 地址 []

  今天我把自己對於內存四區中全局區見解寫出來,希望可以幫到大家,同時也希望指出我的不正!

  可能有些人不解,我不是想通過,內存四區引入指針麽?怎麽上來就用指針?

  這一點我要說明一下,我用指針是為了更清楚的表明我對於內存四區的見解,是想讓大家明白,內存四區是什麽?棧區,堆區和全局區之間的關系!

  正如同在棧區和在堆區分配的內存空間是不同的!指針裏存的是地址,地址是哪裏的地址?是內存上的地址!而如果我們分不清我們的指針到底指向的是哪一個區域的地址,調用起來豈不是很麻煩。比如我們在子函數上分配了一個變量(棧區),我們將指針指向這個變量,在主函數中讀取出來的則是一段亂碼!但是我們今天先不說這個,先談一下全局區。

  全局區

  例如在主函數中定義的變量可在子函數中調用(可稱為全局變量),但子函數中定義的變量不可以在主函數中調用,除非是子函數將內存地址指向全局區可在主函數中調用;

  我們先看一個例子:

  

  #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;//這裏返回的是指針指向的地址

}

  通過以上兩個例子我們可以發現:同樣是在子函數中,棧區所分配的內存空間無法傳遞到主函數中,而全局區的卻可以;

  在棧區中分配相同字符串時,打印出來的兩個地址不同。而且當我們將指針指向全局區同樣的字符串時,打印出的地址卻一樣;

  那麽可以這樣認為,在棧區上分配的內存空間在主函數上不會自動析構(程序未運行完之前),而在子函數中會被析構掉(子函數運行完之後),

  在全局區上時, 只要分配了空間,就不會被自動析構掉,而且為了節省內存資源,當我們多次調用它時,它不會再次分配內存空間。

內存四區中全局區見解