在c語言中,變量通常要求局部變量在函數(shù)最開始聲明,否則會被編譯器報錯,這種變量的聲明周期只限于在函數(shù)體內(nèi)。
創(chuàng)新互聯(lián)為企業(yè)級客戶提高一站式互聯(lián)網(wǎng)+設(shè)計服務(wù),主要包括成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、app軟件定制開發(fā)、小程序定制開發(fā)、宣傳片制作、LOGO設(shè)計等,幫助客戶快速提升營銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗豐富的經(jīng)驗,可以確保每一個作品的質(zhì)量和創(chuàng)作周期,同時每年都有很多新員工加入,為我們帶來大量新的創(chuàng)意。
像你提出的這種,可以無視剛才的要求,在函數(shù)內(nèi)部任意位置聲明變量,他的聲明周期就是for循環(huán)內(nèi)部,每次進入都是新的變量,占用棧上空間。
我有一個小竅門,方便記憶,{}內(nèi)部的變量,聲明周期只在當前{}內(nèi)。
比如:
{
int a;
int b;
}
可以這樣聲明變量,甚至不需要任何循環(huán)體,或者if,這些變量一旦離開當前{},就被銷毀
C語言每一次函數(shù)調(diào)用,編譯器都會為這個函數(shù)調(diào)用分配一段空間,這段空間用來存放該函數(shù)中的所有局部變量和調(diào)用其它函數(shù)時需要傳遞的參數(shù)的副本。每一次調(diào)用這個函數(shù),這段空間都會重新分配,函數(shù)返回后這段空間就被釋放了,所以重復調(diào)用多少次都不會影響的。所有的這些函數(shù)調(diào)用時候分配的內(nèi)存都是在線程的棧上的。
順便說一下,我覺得樓上的回答是不對的: 每個線程都只會訪問自己調(diào)用的函數(shù)中的局部變量的,訪問局部變量是不會存在多線程問題的。會存在多線程問題的肯定不是局部變量,有可能是局部變量指向的其它可共享的對象(例如:堆對象......),或者在函數(shù)中訪問了全局對象,類的成員變量等,這些并不是局部變量。
變量有兩種屬性:
分別是數(shù)據(jù)類型和存儲類型。
一、數(shù)據(jù)類型表示數(shù)據(jù)格式(大小長度)。
比如:int,long,float,double.......
二、存儲類別表示作用域和生命周期。
比如:
1、auto(自動變量是局部變量,定義局部變量時不指定存儲類型,默認自動)。
作用域:定義到函數(shù)結(jié)束。
生命周期:函數(shù)調(diào)用到函數(shù)執(zhí)行結(jié)束。
2、extern外部變量。
作用域:定義開始到源文件結(jié)束。
生命周期:定義開始到程序結(jié)束。
3、static靜態(tài)變量。
可定義全局也可局部。
定義為局部變量不會隨程序調(diào)用執(zhí)行結(jié)束而釋放,且定義賦初值的語句只在函數(shù)第一次調(diào)用執(zhí)行。
局部靜態(tài)
作用域:從定義開始到函數(shù)結(jié)束。(實際函數(shù)將靜態(tài)地址做返回值返回,函數(shù)結(jié)束也能使用該地址)
生命期:從定義到程序結(jié)束。
全局靜態(tài)
作用域:從定義到源文件結(jié)束。(其他文件不能通過extern來使用)
生命周期:定義開始到程序結(jié)束。
4、rigister寄存器
寄存器變量存儲在cpu。
生命周期要理解數(shù)據(jù)在內(nèi)存中如何變化 全局變量在程序運行完后才釋放而局部變量 在用完后立馬釋放;
作用范圍就是其作用的范圍 全局變量整個程序都可以調(diào)用 而局部變量只能在某個函數(shù)中才起作用其他函數(shù)無法調(diào)用
函數(shù)內(nèi)部, 不帶static修飾的, 是局部變量.比如你說的j.
這種,生命周期是從定義位置, 到作用域結(jié)束.
函數(shù)內(nèi)部 帶static的是靜態(tài)局部變量.
函數(shù)外部 帶static的是靜態(tài)全局變量. 帶extern的是外部全局變量. 不帶的 是全局變量.
靜態(tài)局部變量以及所有的全局變量, 生命周期都是整個程序運行時間.