2016-11-12 105 views
-3

我創建了一個簡單的程序來理解指針的行爲。我試過這個程序來理解指針的行爲,但是它產生了分段錯誤。這個程序中分段錯誤的原因是什麼?

#include<stdio.h> 

int main() 
{ 
    int x =9; 

    /* what is meaning of this line when & operator is not used*/ 
    int *pts = x; 

    printf("%d",*pts); 
    return 0; 
} 

爲什麼會出現分段故障?我試圖瞭解程序的行爲。

+0

這不是一個「調試我的代碼的免費」服務! –

+0

你想要x的地址,而不是他的值,基本上你是說x的地址是0x0009(不是真的,你不允許訪問這個地址,結果你得到了seg-fault):使用int * pts =&x;',其中'&x'表示地址x –

+2

這應該是編譯器錯誤(或者至少是警告)。 – melpomene

回答

0

您將指針pts的地址設置爲無效地址(如Keine Lust所述)。當系統嘗試取消引用指針(訪問目標的值)時,它會失敗併產生分段錯誤。運算符&返回指針可以使用的變量的地址。

2

/*當操作者&未使用*/

INT * PTS = X是什麼這一行的含義;

這意味着您初始化指針的值爲x(在您的程序中爲9)。

爲什麼會出現分段故障?

因爲9不是合法的指針值,可以取消引用。所以*pts會導致分段錯誤。

2

的C11標準說(6.3.2.3指針):

的整數可以被轉換爲任何指針類型。除前面指定的以外,結果是實現定義的,可能未正確對齊,可能不指向引用類型的實體,並且可能是陷阱表示

強調是我的;它解釋了爲什麼會出現分段錯誤。您將任意值轉換爲指針,並且結果不指向對象;解引用會導致未定義的行爲。

附於本段落A腳註說明:

用於指針轉換爲整數或整數的指針的映射函數意在與執行環境的尋址結構一致。

的「除如前所述」是指:

一個整數常量表達式用值0,或者這樣轉換爲類型無效*的表達式,被稱爲空指針常數。如果一個空指針常量被轉換爲一個指針類型,那麼被調用的空指針所產生的指針將被保證與指向任何對象或函數的指針進行比較。

1

我猜,你是什麼將代碼,

#include<stdio.h> 

int main() 
{ 
    int x =9; 

    /* add & before x */ 
    int *pts = &x; 

    printf("%d",*pts); 
    return 0; 
} 
相關問題