2016-11-22 3 views
0

objectNameとquestionNameにアクセスしようとしていますが、セグメンテーションフォルトが発生し続けます。私がchar配列を使うと、objectNameではなくquestionNameだけが出力されます。私はすべてにメモリを割り当てたので、どのようにこれらのポインタにアクセスする必要があります。なぜ誰かが私が偉大なセグメンテーション違反を得る理由を説明することができれば。構造体のポインタにアクセスしてセグメンテーションフォールトを取得しています

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

struct node 
{ 
char *objectName; 
char *questionName; 
struct node *left_ptr; 
struct node *right_ptr; 
}; 

void treePrint(struct node *ptr) 
{ 
if (ptr == NULL) 
{ 
    return; 
} 
else 
{ 
    if (ptr -> questionName != NULL)//ptr is a question 
    { 
    printf("question: %s\n", ptr -> questionName); 

    //now print the yes and no subtrees: 
    treePrint(ptr->left_ptr); 
    treePrint(ptr->right_ptr); 
    } 
    else 
    { // ptr is an object 
    printf("object: %s\n", ptr -> objectName); 
    } 
} 
} 



int main(int argc, char const *argv[]) 
{ 

struct node *firstquestion = malloc(sizeof(struct node)); 
struct node *secondquestion = malloc(sizeof(struct node)); 

struct node *firstObject = malloc(sizeof(struct node)); 
struct node *secondObject = malloc(sizeof(struct node)); 
struct node *thirdObject = malloc(sizeof(struct node)); 

strcpy(firstquestion -> questionName, "Does it have a tail?"); 
strcpy(secondquestion -> questionName, "Is it round and edible?"); 

strcpy(firstObject -> objectName, "A pangolin"); 
strcpy(secondObject -> objectName, "Mandeep"); 
strcpy(thirdObject -> objectName, "Orange"); 

firstquestion -> left_ptr = firstObject; 
firstquestion -> right_ptr = secondquestion; 
secondquestion -> left_ptr = thirdObject; 
secondquestion -> right_ptr = secondObject; 


treePrint(firstquestion); 

    return 0; 
} 
+0

あなたは 'firstquestion-> questionName'にメモリを割り当てていないので、' strcpy(firstquestion - > questionName、 "テールがありますか?");は未定義の動作です。 – EOF

答えて

3

またようにquestionNameobjectNameとをmalloc()する必要があります。しかし、あなたはまた、より簡単なものとsimlperを行い、この

ptr->questionName = strdup("Does it have a tail?"); 

もう一つのようなstrdup()を使用することができ、あなたはNULLに対してmalloc()の戻り値をチェックする必要があります。

注:->オペレータの周囲にスペースを入れないでください。ひどいです。また、空白の使用法と一貫して、それほど多くはないがそれほど多くはない程度に十分に使用してください。あなた自身のスタイルと一致しているだけです。

+0

okありがとうございます – guy

+0

私はそれをprintメソッドで行います:struct node * objectName = malloc(sizeof(struct node)); – guy

+0

@ guyいいえ、正しい数の文字を割り当てる必要があります。 'objectName'は' char'型です。あなたはそれを理解せずに宿題をしようとしていますか?ただお届けするには? –

関連する問題