3 回答

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊
按照標(biāo)準(zhǔn)設(shè)置,所有全局和函數(shù)靜態(tài)變量都會(huì)自動(dòng)初始化為0。自動(dòng)變量不會(huì)初始化。
int a[10]; // global - all elements are initialised to 0
void foo(void) {
int b[10]; // automatic storage - contain junk
static int c[10]; // static - initialised to 0
}
但是,最好始終手動(dòng)初始化函數(shù)變量,而不管其存儲(chǔ)類如何。要將所有數(shù)組元素設(shè)置為0,您只需要將第一個(gè)數(shù)組項(xiàng)分配為0-省略的元素將自動(dòng)設(shè)置為0:
int b[10] = {0};

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊
為什么auto
在其他所有內(nèi)容都未初始化時(shí),函數(shù)局部變量(存儲(chǔ)類)未初始化?
C與硬件接近;這是它最大的優(yōu)勢(shì),也是最大的危險(xiǎn)。究其原因auto
存儲(chǔ)類對(duì)象具有隨機(jī)初始值,是因?yàn)樗麄冊(cè)跅I戏峙?,和設(shè)計(jì)決定不自動(dòng)清除這些(部分原因是因?yàn)樗麄冃枰獙?duì)每個(gè)函數(shù)調(diào)用將被清除)。
另一方面,非auto
對(duì)象僅需清除一次。另外,出于安全原因,操作系統(tǒng)必須清除分配的頁面。因此,這里的設(shè)計(jì)決定是指定零初始化。為什么安全性也不是堆棧的問題?實(shí)際上,一開始它已清除。您看到的垃圾來自您自己程序的調(diào)用框架的早期實(shí)例以及它們所調(diào)用的庫代碼。
最終結(jié)果是快速的內(nèi)存有效代碼。裝配的所有優(yōu)勢(shì)無所不包。在dmr發(fā)明C之前,“ Basic”和整個(gè)OS內(nèi)核之類的“ HLL”實(shí)際上確實(shí)是作為大型匯編程序?qū)崿F(xiàn)的。(在某些地方,例如IBM除外)。
- 3 回答
- 0 關(guān)注
- 600 瀏覽
添加回答
舉報(bào)