2017-12-26 46 views
1

구조체에 문제가 있습니다. 자체에 대한 포인터가있는 구조체를 사용해야합니다. 나는이 일을하고 난 작동 생각 :C 자체에 대한 포인터가있는 C 구조체 - 값 액세스

typedef struct tag_t tag_t; 
    struct tag_t{ 
    char name[15]; 
    int is_self_closing; 
    tag_t *child; 
}; 

내가 너무 내 프로그램 코어 덤프와의 HTML 태그의 자식 "몸"과 같은 태그에 아이를 추가하는 기능을하고있다 자식 포인터의 "name"및 "is_self_closing"변수를 사용하려고 할 때 세그멘테이션 오류가 발생했습니다. 나는 그들에게 정확하게 접근하는 방법을 모른다. 이것은 프로그램의 전체 코드입니다. 당신의 add_chilld() 기능 내부

#include <stdio.h> 
#include <string.h> 

typedef struct tag_t tag_t; 
struct tag_t{ 
    char name[15]; 
    int is_self_closing; 
    tag_t *child; 
}; 

void add_chilld(tag_t *,char[15],int); 

void print_markup(tag_t); 

int main(int argc, char **argv){ 
    tag_t parent,child; 
    strcpy(child.name,"body"); 
    child.is_self_closing = 1; 
    strcpy(parent.name,"html"); 
    parent.is_self_closing = 0; 
    add_chilld(&parent,child.name,child.is_self_closing); 
    printf("child name = %s child closing = %d\n",child.name,child.is_self_closing); 
    printf("%s %d %s\n",parent.name,parent.is_self_closing,parent.child->name); 
    return 0; 
} 

void add_chilld(tag_t *parent,char name[15],int is_self_closing){ 
    if(is_self_closing == 1){ 
     printf("parent name = %s\n",parent->child->name); 
     strcpy(parent->child->name,name); 
     parent->child->is_self_closing = is_self_closing; 
    }else{ 
     parent->child = NULL; 
    } 
} 
+1

스택 오버플로에 오신 것을 환영합니다! 지금까지 연구/디버깅 노력을 친절하게 보여주십시오. 먼저 [Ask] 페이지를 읽으십시오. –

+0

a) 부모 이름으로 자녀의 이름을 지정하기 전에 자녀의 이름을 인쇄하고 있습니다. b) 자식 포인터가 아무 것도 가리키고 있지 않습니다. c)'char name [15]'는 당신이 생각하는대로하지 않습니다. –

답변

0

, 당신은 parent->child에 액세스하려고하지만, 당신은 유효한 아무 것도 가리하지 않았다.

그래서, 당신은 당신이 필요로하는, 당신이 parent->child->name 같은 것을 사용할 수있다 전에, 즉 undefined behavior

원인이 불확정 값, 즉, 잘못된 메모리 주소를 보유하고 초기화되지 않은 포인터를 역 참조하고 parent 변수의 child 구성원이 실제로 자식 (이전에 할당 한)으로 설정되어 있는지 확인하십시오.

+1

DV 이유는 누구입니까? –