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