我期待下面的代碼給出分段錯誤。由於空指針指向沒有任何東西,增加指向沒有任何東西是沒有意義的。 但它的印刷0,4,8,12,16。預期的分段錯誤,同時遞增空指針
#include<stdio.h>
int main()
{
int *p ,i=0;
p = NULL;
for(i=0;i<5; i++) {
printf("%d\n",p++);
}
return 0;
}
我期待下面的代碼給出分段錯誤。由於空指針指向沒有任何東西,增加指向沒有任何東西是沒有意義的。 但它的印刷0,4,8,12,16。預期的分段錯誤,同時遞增空指針
#include<stdio.h>
int main()
{
int *p ,i=0;
p = NULL;
for(i=0;i<5; i++) {
printf("%d\n",p++);
}
return 0;
}
你不 dereferncing p
,你將它存儲值到int
。如果你在那裏做:
printf("%d\n",*p++);
然後你賽格故障。
他可能會遇到分段錯誤,但不能保證會發生什麼。 –
@paul感謝您的回答 – Megharaj
此代碼中沒有轉換。爲預期爲'int'的說明符傳遞指針具有未定義的行爲,而不是隱含的轉換。它可能發生如同轉換髮生一樣的行爲,但這不可靠。 –
您的程序有未定義的行爲:++
運算符只允許指向指向有效對象的指針,此外您還將指針值傳遞給printf
,其中格式指定爲int
。
未定義的行爲可能導致任何事情,即使您的程序似乎工作。 C不會對此類代碼強加任何編譯時間或運行時檢查。不要這樣做。
@Joe,錯,閱讀也會有這個效果,這裏沒有閱讀。 – unkulunkulu