我有這個代碼:
#include <stdio.h>
int main()
{
int arr2[5];
arr2[0] = 0;
arr2[1] = 1;
arr2[2] = 2;
arr2[3] = 3;
int arr3[5] = {1, 2, 3, 4};
}
當我列印每個陣列的第五個位置時,我得到了不同的結果:
printf("Fifth: %d\n", arr2[4]); // Prints Random number
printf("Fifth: %d\n", arr3[4]); // Prints Zero!
輸出:
Fifth: -858993460
Fifth: 0
我知道第一個是指向記憶體中第五個位置的指標,第二個是陣列是如何用 0 初始化的。我不明白他們為什么給我 2 個不同的值。在這兩種情況下,我都將陣列的大小設定為 5;為什么會這樣?
uj5u.com熱心網友回復:
和
int arr2[5];
arr2[0] = 0;
arr2[1] = 1;
arr2[2] = 2;
arr2[3] = 3;
你實際上并沒有初始化陣列。您創建它時未初始化,并且每個元素的值都不確定。然后分配給四個單獨的元素,留下第五個未初始化。
另一方面,隨著
int arr3[5] = {1, 2, 3, 4};
您顯式初始化所有元素。前四個具有顯式值,然后其余(單個,對于此特定陣列)元素為零。
uj5u.com熱心網友回復:
如果您愿意,未顯式初始化的區域變數會獲得不確定的值,“垃圾”。列印不確定的值是未指定的行為,這意味著輸出可能根本不遵循任何邏輯。每次列印相同的未初始化位置時,您甚至可能會得到不同的值。
在某些情況下,訪問未初始化的區域變數甚至是未定義的行為 - 請參閱(為什么)正在使用未初始化的變數未定義行為?
C 中的初始化與變數宣告發生在同一行。由于=線路int arr2[5];上沒有,因此沒有進行初始化。下面幾行不是初始化,而是運行時賦值。你遺漏了最后一項,所以它仍然是不確定的。
但是,如果陣列被部分初始化,則陣列中的其余項將被隱式初始化“就好像它們具有靜態存盤持續時間”,這實際上意味著它們被設定為零并且該行為是明確定義的。
uj5u.com熱心網友回復:
您的資料在堆疊上。對于此類變數,標準不保證初始值(因此未定義)。您沒有初始化 arr2[4],并且您獲得了標準不提供任何保證的值,因此它們實際上可以是任何東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/372824.html
下一篇:在C中將多維陣列作為引數傳遞
