2012-07-02 155 views
13

可能重複:
Segmentation Fault when attempting to print value in C不能賦值給變量和指針

我很新的C,但不知道爲什麼這個程序中斷。如果我刪除了與i有關的行,程序就會編譯並運行,但是如果我分配了i,那麼我不能再爲*ptr分配任何內容,而不會中斷程序。

int main(void) 
{ 
    int i; 
    int *ptr; 

    i = 2; 
    *ptr = 5; 
    printf("%d",*ptr); 
} 
+2

[這](http://stackoverflow.com/questions/11278085/segmentation-fault-when-前試圖打印價值在C)幾乎相同的問題昨天才被問到。 – pb2q

+0

問題是你已經創建了一個指針,但沒有給它指向任何東西。您可以使用新分配一些內存,或者將它指向像i這樣的變量。 – jlunavtgrad

回答

11

您將指針保留爲未初始化的值。因此,當您解除引用時(*ptr),您訪問內存中的任意位置,導致分段錯誤。

ptr的東西將其分配給ptr本身(不*ptr)的變量(如&i)地址或一些新分配的內存(如malloc(sizeof(int)))。

+0

那麼,爲什麼它只是使用 'int * ptr;' '* ptr = 5;'? –

+0

它可能「工作」,或者可能會崩潰,具體取決於您的平臺,編譯器,設置......無論哪種方式,這是不正確的。 C是一種不安全的語言,它不檢查內存錯誤,它們可能不會被注意到你的程序,並在不期望的時候觸發。 :) – Kos

+1

謝謝!我從來沒有使用過手動內存管理語言,所以這對我來說都是新的。當然還有更多想法。 –

-1

在C中使用指針之前,您需要將指針設置爲現有的內存塊,您需要爲其分配內存,就像這樣。

int *ptr = (int *)malloc(sizeof(int)); 
4

下面是答案爲C:

int main(void) { 
    int i; 
    int * ptr = (int *)malloc(sizeof(int)); 

    i = 2; 
    *ptr = 5;  
    printfn("%d",*ptr); 
    free(ptr); 
} 

另外,您可以爲我和* PTR分配線使用類似:

int main(void) { 
    int i; 
    int * ptr; 

    i = 2; 
    ptr = &i;  
    printfn("%d",*ptr); // should print 2 
} 

還要注意的是免費的就出來了!

1

你聲明ptr,但沒有指向任何東西。然後你試圖寫出它指向的內容。這絕不是一個好主意。試着做PTR點我加入行

ptr = &i; 

你嘗試寫入* PTR