2014-02-25 4 views
1
#include<stdio.h> 
#include <stdlib.h> 

struct a1 { 
    int value ; 
}; 

struct cf { 
    struct a1 *a1; 
    int val; 
}; 

main(){ 

    struct cf *cf = malloc(sizeof(struct cf)); 

    cf->a1->value = 45; 
    printf("cf->a1->value = %d \n",cf->a1->value); 

} 

이 C 코드를 실행하려고 할 때 세그먼트 오류가 발생합니다 (코어 덤프 됨)!다음 C 코드에서 세그먼트 오류가 발생하는 이유

+4

당신은 cf''을위한 공간을 할당,하지만 당신은'구조체 a1' 포인터,'a1', 접근 가능한 메모리를 가리키는 것으로 가정 할 이유가 있습니까했습니다 ? 'cf-> a1'은 의미없는 값이며, 역 참조를해서는 안됩니다. 개입하는'cf-> a1 = malloc (sizeof (struct a1)); '이 필요하다. –

답변

3

이유는 cf에 필요한 메모리를 할당했지만 a1에 필요한 메모리를 할당하지 못했기 때문입니다. 당신은 a1 메모리를 할당하지 않았기 때문에 당신은 세그먼트 오류를 ​​얻을 수

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

struct a1 { 
    int value ; 
}; 

struct cf { 
    struct a1 *a1; 
    int val; 
}; 

main(){ 

    struct cf *cf = malloc(sizeof(struct cf)); 
    cf->a1 = malloc(sizeof(struct a1)); 
    cf->a1->value = 45; 
    printf("cf->a1->value = %d \n",cf->a1->value); 

} 
0

같은 것을해야한다. 또한 모든 것이 잘되면 void*에서 struct cf*으로 malloc을 캐스팅하고 주 기능을 int main()return 0으로 선언해야합니다. 포인터 a1 & val로 회원이 구조체 cf 여기

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

struct a1 { 
    int value ; 
}; 

struct cf { 
    struct a1 *a1; 
    int val; 
}; 

int main(){ 

    struct cf *cf = (struct cf*)malloc(sizeof(struct cf)); 
    cf->a1=(struct a1*)malloc(sizeof(struct a1)); 

    cf->a1->value = 45; 
    printf("cf->a1->value = %d \n",cf->a1->value); 

} 
+0

C에서'malloc'을 캐스팅하지 않습니다 - [malloc의 결과를 캐스팅합니까?] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – crashmstr

+0

@crashmstr gcc를 사용하면 캐스트하지 않으면 구문 오류가 발생합니다. – WileTheCoyot

+0

C 컴파일러에서는 구문 오류가 발생하지 않아야합니다. 반면 C++에서는 그렇습니다. 질문은 C로 표시됩니다. – crashmstr

0

malloc(sizeof(struct cf)); 당신이 할당되는 메모리 : 는 여기에 귀하의 문제에 대한 해결책입니다. 포인터 a1은 구조체 유형 a1value이라는 멤버가 있음을 가리 킵니다. 그러나 malloc()은 포인터 용으로 메모리 만 할당하지만 해당 멤버에 대해 메모리를 할당하지 않습니다. 즉 value입니다. 거기에 알 수없는 메모리에 45을 쓰려고합니다. 너무 같은 구조체 a1에 대한 메모리를 할당

cf->a1 = malloc(sizeof(struct a1));

관련 문제