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


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

 

該題目考查的知識點是變量的存儲類型及性質。C語言經過編譯之后將內存分為以下幾個區域:

 

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

 

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

 

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

 

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

 

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

 

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

 

有興趣的讀者可以運行下面的程序,分析一下運行結果。

#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;
}

---------------------
作者:taxue505
來源:CSDN
原文:https://blog.csdn.net/yangquanhui1991/article/details/51786380/
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM