#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a=10 ;
int *p;
p = &a;
*(p 1) = 20;
printf("The value at (p 1) is %d\n",*(p 1));
return 0;
}
我正在嘗試做一些指標運算并嘗試實作代碼。我正在嘗試使用 *(p 1) 將值 20 分配給記憶體中的下一個地址并使用 printf 陳述句列印它,但我的代碼沒有產生任何輸出。為什么會這樣?
uj5u.com熱心網友回復:
在下面的:
int a=10 ;
當a被宣告和初始化時,10 被放置在記憶體中它被創建的位置,如下面的記憶體描述所示:
|?|10|?|...
^
a
然后陳述句
int *p;
p = &a;
創建一個指標p,設定指標指向同一個位置
|?|10|?|...
^
p
在宣告中 *(p 1) = 20;
*(p 1) 參考您的行程不擁有的記憶體位置,超過 1 個記憶體位置 a
|?|10|?|...
^
試圖在那里賦值會呼叫未定義的行為。
uj5u.com熱心網友回復:
以這種方式看,*(p 1)與擁有p[1]this 相同意味著您正在尋找a[1]但a不是陣列,a[1]在您的程式中不存在,您無法在該記憶體位置讀取或寫入,我們真的不知道是什么在那里,這就是您的程式遭受未定義行為的原因。
uj5u.com熱心網友回復:
這實際上以一種非常可疑的方式打擊了我。我在代碼中遇到分段錯誤。我們得到了不同的結果。
首先,誰給了你任何保證,p 1甚至是記憶?它很可能是 0x00。可不是鬧著玩的!你可能在一個奇怪的系統上,其中記憶體向后作業,如果&a是 0x04,那么a 1就是 0x00。沒有系統會因為某種原因導致記憶體倒退,但它可能會發生。我不認為該標準強制執行與此相關的任何事情(如果我錯了,請糾正我)。這只會造成混亂,難怪沒有人嘗試過。
其次,誰給了你任何p 1尚未使用的保證?編譯器可能正在使用它,它經常這樣做。
第三,誰給你任何保證,拿起一些你沒有分配的記憶體甚至會起作用?分配記憶體基本上是保留記憶體,如果您不這樣做,則無法保證任何作業。想象一輛公共汽車。如果您不預訂座位,則無法保證您可以坐在上面。
那么會發生什么?未定義的行為!基本上,如果達到這種情況,那么編譯器可以撰寫代碼,向總統發送死亡威脅,并讓你參加恐怖組織的民兵培訓,編譯器仍然可以稱自己為“符合 ISO/IEC 9899:2018 標準”。除非標準中有一個通俗易懂的“編譯器不能插入惡意代碼”短語。我沒有檢查。是的,這就是為什么你不應該使用晦澀的編譯器。撇開玩笑不談,基本上任何事情都有可能發生,上帝,只有上帝知道會發生什么。甚至編譯器、你、ISO 都不知道會發生什么。這就是為什么“未定義的行為”如此可怕的原因。不要用記憶做奇怪的事情。
順便說一句,讓這件事特別有趣的是,大多數編譯器與32 位系統上&p的編譯器相同。p 1它可能在 64 位系統中重疊。請注意這個詞,不能保證。
uj5u.com熱心網友回復:
'a' 是一個普通整數,因為沒有元素,所以您無法在元素中導航。
它只是一個指向變數的普通指標。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a[10];
*(a 1) = 20;
printf("The value at (p 1) is %d\n",*(a 1));
return 0;
}
我想這就是你想要的
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416407.html
標籤:
上一篇:在結構中使用指向互斥鎖(pthread_mutex_t*)的指標,而不是全域互斥鎖
下一篇:C中動態變化的運算子
