編碼
int n = 25;
int *p = &n;
printf("%x\n %d\n %x\n", p, p[0], p[1]);
回傳:
\<adress-of-p
25
\<adress-of-p>
當然,我永遠不會這樣做,但在 K&R 宣告中
"如果 pa 是一個指標,運算式可以將它與下標一起使用;pa[i] 與 *(pa i) 相同。
所以我很好奇。
uj5u.com熱心網友回復:
這個說法
printf("%x\n %d\n %x\n", p, p[0], p[1]);
出于兩個原因呼叫未定義的行為。
第一個是要輸出指標,您應該使用正確的轉換說明符。第二個是您不能取消參考像這樣p[1]
不指向有效物件的指標。
相反,你可以寫例如
printf("%p\n %d\n %p\n", ( void * )p, p[0], ( void * )( p 1 ) );
uj5u.com熱心網友回復:
當您p[1]
在代碼中進行評估時,您正在呼叫未定義的行為,因此您的程式可以做任何事情。
這是未定義的行為,因為p
指向的點n
只是一個整數,而不是整數陣列。也是p[0]
,n
但p[1]
未定義。基本上這是一個陣列溢位錯誤。
uj5u.com熱心網友回復:
您的程式具有未定義的行為,因為它取消參考了一個不指向任何內容的指標。
您遇到的特定癥狀與讀取函式中的下一個變數一致
uj5u.com熱心網友回復:
p[n] 語法是 *(p n) 的語法糖。
所以p[0]就是*(p 0),也就是*p,而且由于p指向n,所以*p就是n的值,也就是25。
現在,p[1] 是 *(p 1)。所以理論上你會得到記憶體中n之后的下一個整數。在這種特殊情況下,記憶體中的下一件事恰好是 p 本身,即 n 的地址。(請注意,這并不能保證,您的編譯器只是選擇以這種方式安排事情。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462783.html
下一篇:宣告一個字符指標