int main() {
int b=1, c=3, e=4;
int *a=&b;
a[1]=c;
a[2]=e;
printf("%d, %d, %d\n", a[0], a[1], a[2]);
return 0;
}
上面的代碼產生1, 3, 4. 為什么我沒有收到編譯器錯誤?變數不必在記憶體中連續對齊,那么為什么只存盤 的地址的指標也可以指向其他指標b呢?
uj5u.com熱心網友回復:
這叫做未定義行為
對于未定義的行為,任何事情都可能發生。它可能會列印,1, 3, 4但也可能會列印,42, 42, 42或者程式可能會崩潰,或者您的計算機可能會關閉或......任何事情
唯一有效的訪問是a[0]但其他的都是無效的(也就是未定義的行為)。
C 中的指標指向一個元素,您可以使用*pointer或訪問該元素pointer[0]。
C 語言還允許您訪問*(pointer 1)或pointer[1]。在這種情況下,編譯器希望您有一個元素陣列。而且..如果你不這樣做,那是你的問題——編譯器相信你知道你在做什么,并且只生成等效的代碼。
因此,如果您做錯了(例如在您發布的代碼中),編譯器將不會注意到。您最終會得到一個具有未定義行為的程式。
究其原因,你的代碼是錯誤的是,a[1]將訪問記憶體只是后a[0](這是b),并期望另一個int是設在那里。而這種期望并不適用于您的程式。也許這是真的,也許c它實際上位于記憶體中,b 但不能保證。編譯器可能會以任何順序將變數放在記憶體中,因此我們無法分辨b(又名a[0])之后的記憶體包含什么。所以邊做邊讀a[1]只是未定義的行為……我們不知道會發生什么。
為了讓事情變得更加“奇怪”……也許 c 和 e 不存在于記憶體中……事實上,您的代碼很可能如此……
uj5u.com熱心網友回復:
C 中的指標和陣列 - 區別
甲指標在C處于存盤器中的地址。一個陣列是一些型別的值的連續串列。陣列將為它保留足夠的記憶體以包含所有這些值;指標本身沒有分配給它的記憶體,超出了存盤它參考的地址所需的記憶體。作為 C 程式員,您有責任確保您使用的指標指向有效的記憶體塊,并且您不讀取或寫入這些塊外的記憶體位置。
為什么我沒有收到編譯器錯誤?
因為 C 允許您將陣列語法與指標一起使用,并且這樣做通常是有效的。考慮:
int b[3]={1, 3, 4};
int *a=&b;
現在b是 , 的陣列int,并a指向該陣列的開頭,因此讀取和寫入a[1]and是完全合法的a[2]。但b只能容納 3 個整數,因此讀取a[3]ora[10]將是錯誤的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314991.html
