全局變量和局部變量在內存中的區別

答:有區別。全局變量保存在內存的全局存儲區中,佔用靜態的存儲單元;局部變量保存在棧中,只有在所在函數被調用時才動態地爲變量分配存儲單元。程序員

 

該題目考查的知識點是變量的存儲類型及性質。C語言通過編譯以後將內存分爲如下幾個區域:數據結構

 

(1)棧(stack):由編譯器進行管理,自動分配和釋放,存放函數調用過程當中的各類參數、局部變量、返回值以及函數返回地址。操做方式相似數據結構中的棧。函數

 

(2)堆(heap):用於程序動態申請分配和釋放空間。C語言中的malloc和free,C++中的new和delete均是在堆中進行的。正常狀況下,程序員申請的空間在使用結束後應該釋放,若程序員沒有釋放空間,則程序結束時系統自動回收。注意:這裏的「堆」並非數據結構中的「堆」。ui

 

(3)全局(靜態)存儲區:分爲DATA段和BSS段。DATA段(全局初始化區)存放初始化的全局變量和靜態變量;BSS段(全局未初始化區)存放未初始化的全局變量和靜態變量。程序運行結束時自動釋放。其中BBS段在程序執行以前會被系統自動清0,因此未初始化的全局變量和靜態變量在程序執行以前已經爲0。spa

 

(4)文字常量區:存放常量字符串。程序結束後由系統釋放。.net

 

(5)程序代碼區:存放程序的二進制代碼。blog

 

顯然,C語言中的全局變量和局部變量在內存中是有區別的。C語言中的全局變量包括外部變量和靜態變量,均是保存在全局存儲區中,佔用永久性的存儲單元;局部變量,即自動變量,保存在棧中,只有在所在函數被調用時才由系統動態在棧中分配臨時性的存儲單元。內存

 

有興趣的讀者能夠運行下面的程序,分析一下運行結果。ci

#include <stdio.h>
#include <stdlib.h>
int k1 = 1;
int k2;
static int k3 = 2;
static int k4;
int main( )
{ 字符串

   staticint m1=2, m2;
  inti=1;
  char*p;
  charstr[10] = "hello";
  char*q = "hello";
  p= (char *)malloc( 100 );
  free(p);
  printf("棧區-變量地址 i:%p\n", &i);
  printf(" p:%p\n", &p);
  printf(" str:%p\n", str);
  printf(" q:%p\n", &q);
  printf("堆區地址-動態申請:%p\n", p);
  printf("全局外部有初值 k1:%p\n", &k1);
  printf(" 外部無初值 k2:%p\n", &k2);
  printf("靜態外部有初值 k3:%p\n", &k3);
  printf(" 外靜無初值 k4:%p\n", &k4);
  printf(" 內靜態有初值 m1:%p\n", &m1);
  printf(" 內靜態無初值 m2:%p\n", &m2);
  printf("文字常量地址 :%p, %s\n",q, q);
  printf("程序區地址 :%p\n",&main);
  return0;
}

相關文章
相關標籤/搜索