2009-11-23 4 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를 일으키는 지 궁금합니다. 나는 우분투 9.04 (을 i486-리눅스 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

아 그래, 내가 놓친 바보 같은 줄 알았어. 고마워! –

+0

sizeof (struct Wrapper) 대신 sizeof * test를 쓸 수도 있습니다. –

1

는 먼저 래퍼의 인스턴스를 생성해야합니다

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

행운을 빕니다.

1

초기화되지 않은 포인터를 사용하고 있으므로 segfault가 사용됩니다. 예를 들어 -Wall을 사용하여 더 많은 경고를 설정하면 이런 종류의 오류가 발생할 수 있습니다.

경고를 표시하려면 일부 최적화 (-nn)와 함께 -Wall을 사용해야합니다. 은 아래를 참조)

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

프랑스어 단어를 사용하는 동안은,이 컴파일러 메시지가 모욕하지만 경고되지 않습니다 : 예를 들어,

gcc -Wall -O2 -c test.c 

사용하여 코드를 컴파일 다음과 같은 오류 메시지가 결과 테스트 포인터로 메모리를 할당하는 코드

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

    return 0; 
}