C語言變量的記憶體配置設定
1、 棧區(stack)。棧,就是那些由編譯器在需要時配置設定,在不需要的時候自動清除的變量的存儲區。裡面的變量通常是局部變量、函數參數等。(由編譯器管理)
2、 堆區(heap)。一般由程式員手動配置設定、手動釋放,若程式員不釋放,程式結束時可能由系統回收。注意,它與資料結構中的堆是兩回事,配置設定方式類似于連結清單。
3、 全局區(靜态區)(static)。全局變量和靜态變量
程式結束後由系統釋放。
4、 常量存儲區。常量字元串就是放在這裡的,其變量的值不允許修改,程式結束後由系統釋放。
5、 程式代碼區。以二進制形式存儲程式代碼。
C語言中:變量和函數都有兩個屬性:資料類型、資料的存儲類别。
1、 變量按照作用域(即存儲空間)角度:全局變量和局部變量。
a、 全局變量在程式開始執行時系統就給全局變量配置設定存儲空間,整個程式執行完後系統(自動)釋放這塊空間。作用域範圍整個程式。(存放在全局(靜态)存儲區)
b、 局部變量在函數聲明或函數調用時由系統配置設定局部變量的存儲空間,函數被調用完畢之後系統會釋放局部變量(函數體)。作用域範圍函數體内。(存放在棧區)
2、 變量按照變量值存在時間的生命周期(即生存期)角度:靜态存儲方式和動态存儲方式。
a、 靜态存儲方式是程式在運作期間配置設定固定的存儲空間
(存儲位置:全局區(靜态區))
b、 動态存儲方式是程式運作期間根據(我們)需要系統給我們進行動态配置設定存儲空間,程式運作結束後系統動态釋放(或手動釋放)。
(存儲位置:堆區(手動開辟空間)和棧區(函數調用))
練習題:
1、選擇題:
程式的局部變量存儲在(B)中;全局變量存儲在(C)中,動态申請資料存儲在(A)中;調用malloc配置設定的空間存儲在(A)中;二進制編碼存儲在(E)中;被const所修飾的普通變量存儲在(D)中。
A、堆 B、棧 C、全局區 D、常量區 E、程式代碼區
2、全局變量和局部變量在記憶體中的存儲是否有差別?如果有,是什麼差別?
答: 局部變量作用域範圍函數體内。(存放在棧區)
全局變量作用域範圍整個程式。(存放在全局(靜态)存儲區)
3、寫出輸出結果
#include <stdio.h>
void foo(int m, int n)
{
printf(“m=%d, n=%d\n”, m, n);
}
int main()
{
intb = 3;
foo(b+=3,++b); //先執行b+=3,得到6 ,再執行++b,得到7,傳回到被調用函數,得到m=7,n=7
printf("b=%d\n",b);
return0;
}
答案:m=7 n=7
b=7
4、寫出輸出結果
int sum(int a)
{
int b=0;
static int c=3;//靜态的局部變量:其值儲存上一次的值
b+=1;
c+=1;
return(a+b+c);
}
int main()
{
int i;
int a=5;
for(i=0;i<3;i++)
{
printf("%d%d\n",i,sum(a));
}
return0;
}
答案: 當i=0時,執行被調用函數中a=5,b=1,c=4,a+b+c=10
當i=1時,執行被調用函數中a=5,b=1,c=5,a+b+c=11
0 10 當i=2時,執行被調用函數中a=5,b=1,c=6,a+b+c=12
1 11
2 12
5、寫出輸出結果
int main()
{
inti=2,j=3,k;
k=i+j;
{
intk=8;
printf("%d\n",k); //輸出函數在内部執行語句,輸出的結果為8
}
printf("%d\n",k); //輸出函數在外部執行語句,輸出結果為5
}
答案:8
5
6、寫出輸出結果
int a=3,b=5;
int max(int a,int b)
{
int c;
c=(a>b ? a : b);
return(c);
}
int main()
{
int a=8;
printf("%d\n",max(a,b)); //a=8,b=5
return0;
}
答案:8
解析:如果同一個源檔案中,全局變量與局部變量同名,則在局部變量的作用範圍内, 全局變量被“屏蔽”,即它不起作用。
7、什麼是内連函數?定義内連函數的好處是什麼?
答案:将函數調用的語句用函數執行的語句給替換掉,過程發生在程式的編譯時期
優點:節省程式的時間,提高程式的執行效率