2017-02-02 3 views
0

중첩 된 구조체를 기본값으로 초기화하고 하위 구조체 필드의 특정 필드 만 할당하려고했습니다. 그래서 중첩 된 구조의 모든 내용을 초기화 할 필요는 없습니다.C 중첩 된 구조체의 기본 초기화

아래 샘플 코드에서 볼 수 있듯이 하위 하위 구조의 필드 값을 인쇄하는 동안 세그먼트 화 오류가 발생합니다. 누구든지 각 필드를 거치지 않고 기본값을 초기화하는 더 좋은 방법을 제안합니까? 감사

struct special_char 
{ 
    char c; 
    int size; 
}; 

struct alphabet 
{ 
    struct special_char* special_c; 
    int special_char_size; 
}; 

struct numeral 
{ 
    int array_numeral; 
    int size; 
}; 
struct alpha_numeral 
{ 
    struct alphabet alpha; 
    struct numeral num; 
    int size; 
}; 

int main() 
{ 
    printf(" Initialization of nested structures !\n"); 
    struct alpha_numeral test = { { { 0 } } }; 
    printf("values %d", test.alpha.special_c->size); 
    return 0; 
} 

출력 : 중첩 된 구조의 초기화!
분할 오류 (덤프 코어)

+8

C 또는 C++? 하나를 선택하면 대답이 달라집니다. –

+1

'special_char * special_c'에 대해 어디에서 메모리를 할당 했습니까? –

+0

C++로 컴파일되지 않습니다. – jotik

답변

0

나는 언어가 C.

당신은 변수 test 모든 0을 초기화 한 것으로 가정하고있다. 즉, test.alpha.special_c은 NULL입니다. NULL 포인터를 역 참조하려고합니다. 세그멘테이션 오류.

+0

"NULL 포인터를 역 참조하려고합니다. 세그먼트 오류입니다." 정말? – George

+0

@George :'printf ("values ​​% d", test.alpha.special_c-> size);'test.alpha의 값.special_c'은 0입니다. – AlexP

+1

nono,'special_c'이 null이라는 것을 알 수 있습니다 만, 실제로 segault가 발생합니까? – George

0

어쩌면 내가 질문을 오해 할 수도 있지만 각 구조체에 생성자를 구현하여 해당 생성자로 내부 변수를 초기화 할 수 있습니다.

분명히 첫 번째 구조체의 생성자에서 패러 메트레이터를 내부 구조체의 생성자에 전달하므로 전달하면됩니다.

+1

그것은 C++ 코드가 아닙니다. 공정하게 op 태그가 올바르지 않습니다. – George

+0

@ 조지 페어 포인트! – Francesco

2

누구나 각 필드를 거치지 않고 기본값을 초기화하는 더 좋은 방법을 제안합니까?

이미 설명한 구조 초기화는 초기 필드를 특정 값으로 설정하고 나머지는 암시 적으로 (0으로) 초기화하는 간단한 방법입니다. 지정된 이니셜 라이저를 사용하여 명시 적으로 초기화 할 초기 멤버가 아닌 멤버를 지정할 수 있습니다.

아래 샘플 코드에서 볼 수 있듯이 하위 하위 구조의 필드 값을 인쇄하는 동안 세그먼트 화 오류가 발생합니다.

Pedantically, 하위 하위 구조에 액세스하지 않습니다. test의 하위 구조가 가리키는 구조의 필드에 액세스하고 있습니다. 를 제외하고, 뾰족한 구조체가 존재하지 않고 명시 적으로 포인터를 0으로 초기화 했으므로 역 참조를하면 정의되지 않은 동작이 발생합니다. 대신 객체를 가리 키도록 설정하십시오.

PS. 이니셜 라이저에 너무 많은 중괄호가 있습니다. 포인터에는 하위 오브젝트가 없습니다.

1

이니셜 라이저 {0}을 사용하여 구조체의 모든 필드를 0으로 설정할 수 있습니다. 그러나 주된 문제점은 널 포인터를 역 참조한다는 것입니다. 포인터를 역 참조하기 전에 변수를 참조하기 위해 포인터를 초기화해야합니다.