2013-10-04 15 views
-2

我期待下面的代碼給出分段錯誤。由於空指針指向沒有任何東西,增加指向沒有任何東西是沒有意義的。 但它的印刷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

@Joe,錯,閱讀也會有這個效果,這裏沒有閱讀。 – unkulunkulu

回答

3

dereferncing p,你將它存儲int。如果你在那裏做:

printf("%d\n",*p++); 

然後你賽格故障。

+3

他可能會遇到分段錯誤,但不能保證會發生什麼。 –

+0

@paul感謝您的回答 – Megharaj

+0

此代碼中沒有轉換。爲預期爲'int'的說明符傳遞指針具有未定義的行爲,而不是隱含的轉換。它可能發生如同轉換髮生一樣的行爲,但這不可靠。 –

2

NULL指針不能被解除引用(你不這樣做)。

相反,您在省略號內傳遞指向printf的指針,並且printf認爲它正在處理整數,隱式執行不安全的轉換(因此您的程序也會調用未定義的行爲)。

+0

如果轉換的結果不能用整數表示,則只有未定義,否則定義實現。 – tinman

+0

@simon謝謝你的回答 – Megharaj

+0

@tinman,贊同,這太寬泛了。謝謝。 –

1

您的程序有未定義的行爲:++運算符只允許指向指向有效對象的指針,此外您還將指針值傳遞給printf,其中格式指定爲int

未定義的行爲可能導致任何事情,即使您的程序似乎工作。 C不會對此類代碼強加任何編譯時間或運行時檢查。不要這樣做。