2009-12-19 4 views
0

난 그냥 자바 생성자처럼 테이블을 만들려면,하지만 난 주에서이 함수를 호출 할 때, 그것은 세그먼트 오류를 ​​C 세그먼트 오류 구조

struct table *create(char *name,int number,char *s_name) 
{ 
    struct table *newTable; 
    newTable->name = name; 
    newTable->number = number; 
    newTable->s_name = s_name; 
    return newTable; 
} 

답변

10
struct table *newTable = malloc(sizeof(struct table)); 

자바는이 같은 C는 가비지 콜렉터를 가지고 있지 않기 때문에 당신이 그것을 사용하여 수행 할 때 무료 전화 잊지 마세요.

+1

이는 sizeof (구조체 테이블) 또는 sizeof * newTable이어야합니다 (나는 후자를 선호합니다). C++과는 달리 struct 태그 앞에는'struct' 키워드가 와야합니다. –

+0

@ 존 : 테이블을 입력하지 않으면 ... 어쨌든 편집했습니다. –

8

당신의 피난처를 제공, 테이블이라는 구조를 가지고 ' 객체에 대한 메모리를 할당했으며 구조의 필드를 참조 해제합니다. 당신은에 액세스하기 전에 newTable에 malloc()으로 메모리를 할당을 사용할 필요가 그것을

0

할당되지 않은/초기화되지 않은 메모리에 액세스하려고합니다. & malloc 또는 기타 메모리 할당 방법을 사용하여 명시 적으로 메모리를 할당하지 않으면 SIGSEGV (Segmentation Fault)가 코드에 완벽하게 적용됩니다.

0

시도 :

struct table *create(char *name,int number,char *s_name) 
{ 
    struct table *newTable = malloc(sizeof(*newTable)); 
    if (!newTable) 
    return NULL; 

    newTable->name = name; 
    newTable->number = number; 
    newTable->s_name = s_name; 
    return newTable; 
} 

또 다른주의의 단어 :이 코드에서 newTable->name 그냥 name 제공을 가리키는, 더 복사가 이루어지지 않습니다. 이것은 당신이 원하는 것이 아닐 수도 있지만,이 작은 발췌문에서 이야기하기는 어렵습니다. 대안은 이름을 복제하는 것입니다. s_name도 마찬가지입니다.

+0

name과 s_name에 대해 strdup()를 사용하여 언급 한 eliben을 사용하십시오. 그것들을 할당하는 것은 아니오입니다. – t0mm13b