c语言中全局变量内存,C语言——全局变量和局部变量在内存中的区别——及编译后的内存分区【栈-堆-全局存储区-文字常量区-程序代码区】...
目錄:
一:全局變量
二:局部變量
三:C語言經過編譯之后將內存分為以下幾個區域
(1)棧(stack)
(2)堆(heap)
(3)全局(靜態)存儲區
(4)文字常量區
(5)程序代碼區
四:區別
1. 全局變量
2.局部變量
一:全局變量
全局變量保存在內存的全局存儲區中,占用靜態的存儲單元
二:局部變量
局部變量保存在棧中,只有在所在函數被調用時才動態地為變量分配存儲單元
三:C語言經過編譯之后將內存分為以下幾個區域
(1)棧(stack)
由編譯器進行管理
自動分配和釋放
存放函數調用過程中的各種參數、局部變量、返回值以及函數返回地址
操作方式類似數據結構中的棧【類似】
(2)堆(heap)
用于程序動態申請分配和釋放空間
C語言中的malloc和free,C++中的new和delete均是在堆中進行的
正常情況下,程序員申請的空間在使用結束后應該釋放
若程序員沒有釋放空間,則程序結束時系統自動回收
注意:這里的“堆”并不是數據結構中的“堆”。【不類似】
(3)全局(靜態)存儲區
分為DATA段和BSS段:
DATA段(全局初始化區)存放初始化的全局變量和靜態變量
BSS段(全局未初始化區)存放未初始化的全局變量和靜態變量
程序運行結束時自動釋放
其中BBS段在程序執行之前會被系統自動清0
所以未初始化的全局變量和靜態變量在程序執行之前已經為0
(4)文字常量區
存放常量字符串。程序結束后由系統釋放。
(5)程序代碼區
存放程序的二進制代碼
四:區別
顯然,C語言中的全局變量和局部變量在內存中是有區別的
1. 全局變量
C語言中的全局變量包括外部變量和靜態變量
均是保存在全局存儲區中
占用永久性的存儲單元
2.局部變量
局部變量,即自動變量
保存在棧中
只有在所在函數被調用時才由系統動態在棧中分配臨時性的存儲單元
有興趣的讀者可以運行下面的程序,分析一下運行結果:
#include #include 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;
}
extern int a; // 聲明一個全局變量 a
int a; // 定義一個全局變量 a
extern int a =0; // 定義一個全局變量 a 并給初值。一旦給予賦值,一定是定義,定義才會分配存儲空間
int a =0; //定義一個全局變量 a,并給初值
聲明之后你不能直接使用這個變量,需要定義之后才能使用。
第四個等于第三個,都是定義一個可以被外部使用的全局變量,并給初值。
糊涂了吧,他們看上去可真像。但是定義只能出現在一處。也就是說,不管是 int a 還是 int a=0 都只能出現一次,而那個 extern int a 可以出現很多次。
當你要引用一個全局變量的時候,你就要聲明 extern int a 這時候 extern 不能省略,因為省略了,就變成 int a 這是一個定義,不是聲明。
總結
以上是生活随笔為你收集整理的c语言中全局变量内存,C语言——全局变量和局部变量在内存中的区别——及编译后的内存分区【栈-堆-全局存储区-文字常量区-程序代码区】...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6s改x屏幕
- 下一篇: 大学c语言下上机考试题,计算机考试二级C