3 回答

TA貢獻1839條經驗 獲得超15個贊
按照標準設置,所有全局和函數靜態變量都會自動初始化為0。自動變量不會初始化。
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
}
但是,最好始終手動初始化函數變量,而不管其存儲類如何。要將所有數組元素設置為0,您只需要將第一個數組項分配為0-省略的元素將自動設置為0:
int b[10] = {0};

TA貢獻1757條經驗 獲得超8個贊
為什么auto
在其他所有內容都未初始化時,函數局部變量(存儲類)未初始化?
C與硬件接近;這是它最大的優勢,也是最大的危險。究其原因auto
存儲類對象具有隨機初始值,是因為他們在棧上分配,和設計決定不自動清除這些(部分原因是因為他們需要對每個函數調用將被清除)。
另一方面,非auto
對象僅需清除一次。另外,出于安全原因,操作系統必須清除分配的頁面。因此,這里的設計決定是指定零初始化。為什么安全性也不是堆棧的問題?實際上,一開始它已清除。您看到的垃圾來自您自己程序的調用框架的早期實例以及它們所調用的庫代碼。
最終結果是快速的內存有效代碼。裝配的所有優勢無所不包。在dmr發明C之前,“ Basic”和整個OS內核之類的“ HLL”實際上確實是作為大型匯編程序實現的。(在某些地方,例如IBM除外)。
- 3 回答
- 0 關注
- 610 瀏覽
添加回答
舉報