1. C語言變數生命周期問題設計數組越界
C語言不檢查數組越界和指針,這個程序員負責的事情,編譯時只檢查語法有沒有錯誤。
而且並不是一越界就異常的,異常可能會在將來發生,或者這次越界沒有破壞關鍵數據。
你要先列印數據,再增加global,否則就會輸出下一個值,但是你卻沒有賦值
2. C語言中如何定義全局變數
1、首先,我們可以在函數外面定義變數,就是全局變數。
3. C語言動態變數和靜態變數的區別
一、形式不同:
靜態變數是在定義的時候,有static 修飾的變數,形式為static TYPE var_name = init_value;
動態變數,形式為TYPE var_name = init_value;即沒有static 修飾,其中的=init_value均可省略。
二、作用不同:
動態全局變數:作用域為整個項目,即最終編譯成可執行文件的所有文件中均可以使用動態全局變數,生命周期為從程序運行到程序退出,即貫穿整個運行時間。
靜態全局變數:作用域為當前文件,從定義/聲明位置到文件結尾,生命周期為從程序運行到程序退出,即貫穿整個運行時間。
常量使用
靜態變數也可以用於存儲常數。具體來說,靜態變數(全局變數及匯編語言里定義的符號亦同)可用const,constant或final(根據語言決定)等關鍵字標識,這時其值就會在編譯時設定,並且無法在運行時改變。
編譯器通常將靜態常量與文本一起置於目標文件的文本區域,而非常量初始化數據則置於數據區;而如若有需要,有些編譯器還可選擇為其開辟專用區;為防止常數變數被錯誤的指針寫入覆蓋,亦可在這塊區域啟用內存保護機制。
以上內容參考:網路-靜態變數
4. C裡面靜態動態,生命周期.作用域怎麼區分怎麼用
原創內容:
靜態static.簡單來說就是一個可以在普通函數中定義,卻能夠向後起全局變數作用的東西。一般的定義變數都會默認為auto動態的,在其作用域內有效,棧上分配的變數會因為作用域的結束而被釋放掉內存。而靜態的不會,即使它的程序塊已經執行完畢了,但是它依然存在,知道程序結束。
如:
{
int i=0;
.......
}
到這里這個i就已經沒有意義了
你在此時引用i就出錯了。
如果聲明為靜態變數就不會出錯了。
生命周期應該就是其存在的周期把。
作用域簡單來說就是指你聲明了一個變數,你可以引用並使用它的范圍。
全局變數的作用域是所有函數,你在所有函數中都可以調用它。
普通函數中定義的變數就在函數中有效,不僅僅是函數。如:
void xx()
{
int a;
for(int i=0;i<10;i++)
{
//.,..............
}
}
這里的a和i的作用域都不一樣。
a在xx函數內都有效,而i只在for循環中起作用。
所以按照最新的規則,我們在一個函數中定義兩個for循環,控制循環變數我們可以取相同的名字。如:
void xx()
{
for(int i=0;i<10;i++)
{
//循環1
}
for(int i=0;i<100;i++)
//循環2
}
如果沒有作用域的區分,那麼這樣就已經算是重定義了。
而事實上這是合法的。
5. c++ 變數的生命周期和內存的分配釋放
一般情況下,C語言的存儲數據內存分好幾種:
全局區
常量區
堆區
棧區
全局變數,是全局可見,程序結束後由操作系統收回。
常量區,全局存在,程序結束後由操作系統收回。
堆區,全局存在,程序員主動申請,主動釋放,如果不釋放,導致內存不足,於一個常駐進程內存泄漏,導致程序異常,無法繼續申請內存,當程序結束後,此部分內存由操作系統收回。
棧區,局部存在,系統分配,作用周期在兩個花括弧之間,進入花括弧,操作系統會在棧中開辟一些空間,esp指針減少,稱為入棧,當退出花括弧,系統會釋放分配的棧之內存,esp指針增加,恢復到入花括弧之前的狀態,稱之為出棧。
舉例:
#include <stdio.h>
int gv;
int main()
{
const char * cvchar="hello";
static int mvar = 15;
int a,b;
{
int x = 2;
char * p = (char *)malloc(15);
printf("%s");
free(p);
}
}
分析:
gv,mvar:全局區,但是,gv的作用域為程序可見,mvar是main函數內可見;
a,b:棧區,main函數可見,出了main函數,生命周期和作用域結束,所佔內存在main結束後被收回。
x,p:棧區,main函數里的花括弧可見。出了花括弧,x,p的作用域和生命周期均已結束,所佔內存被回收。
p指向的內存:堆區,通過malloc分配了15個位元組的內存,在free之前或者程序結束前一直可用。
p本身佔用了4個指節的內存,在出花括弧後這4個位元組被回收,但是通過malloc分配的內存並沒有被回收,回收僅僅是p而已。
建議多看看,操作系統與編譯器相關知識。
6. 怎麼理解C語言中常量的生命周期和作用范圍
生命周期要理解數據在內存中如何變化 全局變數在程序運行完後才釋放而局部變數 在用完後立馬釋放;
作用范圍就是其作用的范圍 全局變數整個程序都可以調用 而局部變數只能在某個函數中才起作用其他函數無法調用
7. c++變數生命周期的問題
VC6.0中間類似使用2次
for(int i....)
第二次使用的時候會報錯i重復定義
所以把int i定義在for語句外面,也就是定義成main函數的局部變數就沒事了
這樣還有個好處是和C語法相同,移植到C編譯器上也沒有問題
8. 關於c++的變數 內存分配與釋放 生命期
就你的例子說一下。局部變數a的生命周期在執行完fun();時的確完了,<生命周期結束是說你在下面不能通過變數a去訪問那個內存位置了,和作用域比起來生命周期是運行時候的,作用域是靜態的,生命周期是動態的>,其他關於內存是否被回收,其值是否不改變你都不知道。但在這里那個位置仍然在棧上面,仍可以通過其他方式訪問,比如你用指針p去保留了那個內存位置,而且這時只能說p是野指針,因為在壓棧以及出棧的過程中那個位置的值隨時都可能變化,這樣也很危險,你可能不小心通過p修改了棧上面的數據,通過p去破壞堆棧,程序會出現各種異常,也許還會崩潰。如下,在你的實驗下加入下面的函數fun2,再在調用完fun後調用fun2,你會發現p指向的值被修改了,因為fun2佔用了那段棧空間來完成調用。如果你懂匯編,下面代碼反匯編後就可以清楚地看見堆棧上的變化
int *p = 0;
void fun()
{
{
int a = 2;
p = &a;
}
}
void fun2()
{
int b=3;//這樣效果也許更好,因為這樣和fun值的a的位置是同一個堆棧位置
return;
}
void main()
{
fun();
fun2();
cout<<*p<<endl;
}
9. 關於C中for循環內定義的變數的生命周期
在c語言中,變數通常要求局部變數在函數最開始聲明,否則會被編譯器報錯,這種變數的聲明周期只限於在函數體內。
像你提出的這種,可以無視剛才的要求,在函數內部任意位置聲明變數,他的聲明周期就是for循環內部,每次進入都是新的變數,佔用棧上空間。
我有一個小竅門,方便記憶,{}內部的變數,聲明周期只在當前{}內。
比如:
{
int a;
int b;
}
可以這樣聲明變數,甚至不需要任何循環體,或者if,這些變數一旦離開當前{},就被銷毀
10. C語言中變數的存儲類型有哪幾種,存儲方式哪幾種謝嘍
在C語言中,對變數的存儲類型說明有以下四種:
1、auto 自動變數
2、register 寄存器變數
3、extern 外部變數
4、static 靜態變數
所謂存儲類型是指變數佔用內存空間的方式,也稱為存儲方式。
變數的存儲方式可分為「靜態存儲」和「動態存儲」兩種。
1、靜態存儲變數通常是在變數定義時就在存儲單元並一直保持不變,直至整個程序結束。
2、動態存儲變數是在程序執行過程中,使用它時才分配存儲單元,使用完畢立即釋放。典型的例子是函數的形式參數,在函數定義時並不給形參分配存儲單元,只是在函數被調用時,才予以分配,調用函數完畢立即釋放。
如果一個函數被多次調用,則反復地分配、釋放形參變數的存儲單元。從以上分析可知,靜態存儲變數是一直存在的,而動態存儲變數則時而存在時而消失。
(10)c編譯器變數生命周期擴展閱讀:
變數根據定義的位置的不同的生命周期,具有不同的作用域,作用域可分為6種:全局作用域,局部作用域,語句作用域,類作用域,命名空間作用域和文件作用域。
一、從作用域看:
1、全局變數具有全局作用域。全局變數只需在一個源文件中定義,就可以作用於所有的源文件。當然,其他不包含全局變數的定義的源文件需要用extern關鍵字再次聲明這個全局變數。
2、靜態局部變數具有局部作用域,它只被初始化一次,自從第一次被初始化直到程序運行結束一直存在,它和全局變數的區別在於全局變數對所有函數都是可見的,而靜態局部變數只對定義自己的函數體始終可見。
3、局部變數也只有局部作用域,它是自動對象(auto),它在程序運行期間不是一直存在,而是只在函數執行期間存在,函數的一次調用執行結束後,變數被撤銷,其所佔用的內存也被收回。
4、靜態全局變數也具有全局作用域,它與全局變數的區別在於如果程序包含多個文件的話,它作用於定義它文件里,不能作用到其他文件里,即被static關鍵字修飾過的變數具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態全局變數,它們也是不同的變數。
二、從分配空間看:
全局變數,靜態局部變數,靜態全局變數都在靜態存儲區分配空間,而局部變數在棧里分配空間。
全局變數本身就是靜態存儲方式,靜態全局變數當然也是靜態存儲方式。這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變數的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變數在各個源文件中都是有效的。
而靜態全局變數則限制了其作用域,即只在定義該變數的源文件內有效,在同一個源程序的其他源文件中不能使用它。由於靜態全局變數的作用域局限於一個源文件內,只能為該源文件內的函數公用,因此可以避免在其他源文件中引起錯誤。
1、靜態變數會放在程序的靜態數據存儲區(全局可見)中,這樣可以在下一次調用的時候還可以保持原來的賦值。這一點是它與堆棧變數和堆變數的區別。
2、變數用static告知編譯器,自己僅僅在變數的作用范圍內可見。這一點是它與全局變數的區別。
參考資料來源:網路-變數-存儲類型