2009-11-23 89 views
1

我是一個C初學者,我很好奇,爲什麼這給了我一個賽格故障每次:C結構問題

#include <stdio.h> 
#include <stdlib.h> 

struct Wrapper { 
    int value; 
}; 

int main() { 
    struct Wrapper *test; 
    test->value = 5; 

    return 0; 
} 

我知道我不完全理解指針,但我認爲

struct_ptr->field 

相同

(*struct_ptr).field 

所以試圖進行分配權領域應該沒問題。這工作像預期的那樣:

struct Wrapper test; 
test.value = 5; 

但我很好奇爲什麼使用指針會導致Seg Fault。

我在Ubuntu 9.04(1486-Linux的GNU),gcc版本4.4.1

回答

12

你沒有指針分配到任何東西。這是一個未初始化的指針,指向誰知道什麼,所以結果是未定義的。

您可以將指針賦值給一個動態創建的實例,就像這樣:

int main() { 
    struct Wrapper *test; 
    test = (struct Wrapper *) malloc(sizeof(struct Wrapper)); 
    test->value = 5; 
    free(test); 

    return 0; 
} 

編輯:意識到這是C,而不是C++。相應地固定代碼示例。

+0

啊是的,我知道這將是一個愚蠢的事情,我想念...謝謝! – 2009-11-23 15:29:04

+0

你也可以寫:sizeof * test而不是sizeof(struct Wrapper)。 – 2009-11-23 15:45:22

1

您需要先創建包裝的一個實例:

struct Wrapper *test; 
test = new struct Wrapper; 
test->Value = 5; 

好運。

1

您正在使用未初始化的指針,因此是段錯誤。 如果您打開更多警告,則可能會出現此類錯誤,例如使用-Wall

您需要使用-Wall與某些優化(-On)結合使用才能顯示警告。例如,編譯代碼與

gcc -Wall -O2 -c test.c 

導致以下錯誤消息:

test.c: Dans la fonction «main» : 
test.c:10: attention : «test» is used uninitialized in this function 

在使用法語詞,這個編譯器消息不是一種侮辱,但警告;) 的,請參閱下文代碼分配內存爲您的測試指針

int main() { 
    struct Wrapper *test; 
    test = malloc(sizeof(struct Wrapper)) 
    if(test == NULL) { 
    /* error handling */ 
    } 
    test->value = 5; 
    free(test) 

    return 0; 
}