我剛剛了解了 c 中的指標,我的老師想讓我解釋一下這段代碼結果:
#include <stdio.h>
int main()
{
int n2= 10;
int n1= 6;
int n0= 5;
printf("n2=%d, n1=%d, n0=%d\n", n2, n1, n0);
int* p = &n1;
*p=9;
p ;
*p=15;
p--;
p--;
*p=-3;
printf("n2=%d, n1=%d, n0=%d\n", n2, n1, n0);
getchar();
return 0;
}
只列印出 1 行并且 cmd 說它回傳值 3221225477 真的讓我感到困惑。有人可以幫我嗎
uj5u.com熱心網友回復:
不幸的是,老師的意圖是展示堆疊的作業。
我相信,老師的想法是,變數按順序放置在堆疊框架中。如果是這樣的話,那么你會得到這樣的輸出(從我的筆記本電腦輸出)
n2=10, n1=6, n0=5
n2=15, n1=9, n0=-3
您的程式在我的具有 gcc 4.2 的筆記本電腦上運行,并在其他機器(后來的 gcc)中導致分段錯誤。
但正如Weather Vane在評論中指出的那樣,這是一種未定義的行為,但我認為這是老師想要展示的答案(可能是堆疊的作業,遞增和遞減指標以高于和低于地址)。
假設(這是錯誤的做法),編譯器按順序放置它,然后可以像使用指標的陣列一樣在堆疊中訪問變數。但這確實是訪問沖突。如果您為您的程式 ( gcc -S file_name.c) 生成匯編代碼,您可以看到這一點。在程式運行的機器上,匯編代碼看起來像這樣
movl $10, -8(%rbp)
movl $6, -12(%rbp)
movl $5, -16(%rbp)
在機器中,它導致了分段錯誤,它看起來像這樣,
movl $10, -4(%rbp)
movl $6, -20(%rbp)
movl $5, -8(%rbp)
rbp是基指標,它指向當前堆疊幀的基址。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/427882.html
標籤:C
上一篇:為什么指標不是免費的,它不會給我帶來相同的變數值嗎?[復制]
下一篇:Meson:根據目標改變C編譯器
