為什么在編譯下面這段代碼的時候會出現運行時錯誤?
#include<stdio.h>/span>
int main()
{
int i;
int *p;
int a = 10;
p= &a;
printf("a的地址=%x
",p)。
*(p 0) = 5;
*(p 1) = 6;
*(p 2) = 7;
*(p 3) = 8;
for(i=0; i < 4; i )
{
printf(" address = %x value = %x
", (p i),*(p i))。
}
return 0;
}
在這段代碼中,我正在給名為a的變數地址賦值,然后從a的地址開始,分別給a的下一個地址賦值(6、7、8),
。uj5u.com熱心網友回復:
*(p 1) = 6;
p是一個int* - 意味著當你把它增加1時,它不會向前跳一個位元組 - 它向前跳sizeof(int)位元組(可能是4位元組)。如果你想分別對位元組進行賦值,可以將指標投到char*:
*((char*)p 1) =6。
當你寫類似*(p 1) = 6;的代碼時,你的程式很可能會崩潰。根據標準,這是未定義的行為,在實踐中,通常在幕后真正發生的是,由于p == &a和a在堆疊上,p 1指向堆疊中a上面的4個位元組 - 這可能包含一些隨機值,如堆疊金絲雀或回傳地址 - 而你正在破壞這個值。
uj5u.com熱心網友回復:
這些表達方式:
*(p 1) = 6。
*(p 2) = 7;
*(p 3) = 8;
創建超過a的記憶體邊界的指標,然后被取消參考。 讀取超過物件邊界的記憶體(或者甚至試圖創建這樣的指標,如果它沒有剛剛超過物件)會觸發未定義的行為。
在這個特殊的案例中,它導致了你的程式崩潰,但并不能保證會發生這種情況。
uj5u.com熱心網友回復:
你應該在訪問該記憶體之前分配它。試著使用malloc()。
uj5u.com熱心網友回復:
你的代碼應該是這樣的。
你的代碼應該這樣:
#include<stdio.h>/span>
int main()
{
int i;
int a = 10;
char *p= (char *)&a;
printf("a的地址=%p
",p)。
for (i = 0; i < sizeof(a); i) {
*(p i) = i 5;
}
for(i = 0; i < sizeof(a); i) {
printf(" address = %p value = %d
", p i, *(p i))。
}
return 0;
}
一種解決方案是將p定義為一個指向char的指標。另一種方法是,正如其他答案中所建議的,在進行任何算術之前,只需將p鑄成一個指向char的指標。當使用指標算術時,你 "跳 "的位元組數與被指型別的大小相同。所以,p 1將跳轉4個位元組,如果int是4個位元組的話。這就是為什么你應該使用char的指標,如果你想一次移動一個位元組的話。
此外,你的回圈應該運行N次,其中N為位元組數。所以,我的建議是使用sizeof。
最后,請注意,為了列印一個int,你應該使用%d,并使用%p來列印指標(即地址)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/315464.html
標籤:
上一篇:改變一個無效指標所指向的值
