2017-12-02 16 views
0

したがって、それぞれ異なる値を含むこれらの構造体のツリーがあります。ポインタを使用して構造体メンバにアクセスする際のガベージデータ

StoryElement *createStoryTree (StoryElement *root, char *storage) 
{ 

    char* pos = storage; 
    pos = strchr(pos, '\n'); 
    *pos = '\0'; 
    int size = strlen(storage); 
    char* title = malloc(size + 1); 
    strcpy(title, storage); 

    char* ptr_path_a = pos + 1; 
    pos = strchr(ptr_path_a, '\n'); 
    *pos = '\0'; 
    size = strlen(ptr_path_a); 
    char* path_a = malloc(size + 1); 
    strcpy(path_a, ptr_path_a); 

    char* ptr_path_b = pos + 1; 
    pos = strchr(ptr_path_b, '\n'); 
    *pos = '\0'; 
    size = strlen(ptr_path_b); 
    char* path_b = malloc(size + 1); 
    strcpy(path_b, ptr_path_b); 

    char* ptr_text = pos + 1; 
    pos = strchr(pos + 1, '\0'); 
    *pos = '\0'; 
    size = strlen(ptr_text); 
    char* text = malloc(size + 1); 
    strcpy(text, ptr_text); 

    root = insertIntoStoryElement(root, title, text); 

/* if(strcmp(path_a, "-")!=0 && strcmp(path_b, "-")!=0) 
    {*/ 
    root->path_a_ = readStoryFromFile(root->path_a_, path_a); 
    root->path_a_ = readStoryFromFile(root->path_b_, path_b); 
    //} 

    return root; 
} 

そして、これは最終的に呼び出される関数です。)この関数は、私がinsertIntoStoryElement(上に渡す文字列値を私に提供するものである

StoryElement *insertIntoStoryElement(StoryElement* root, char* title_of_chapter, char* content_of_chapter) 
{ 
    if(root == NULL) 
    { 
    root = makeNewStoryElement(root, title_of_chapter, content_of_chapter); 
    } 
    else if (root->path_a_ == NULL) 
    { 
    root->path_a_ = makeNewStoryElement(root, title_of_chapter, content_of_chapter); 
    } 
    else if (root->path_b_ == NULL) 
    { 
    root->path_b_ = makeNewStoryElement(root, title_of_chapter, content_of_chapter); 
    } 

    return root; 
} 

StoryElement *makeNewStoryElement(StoryElement* root, char* title_of_chapter, 
            char* content_of_chapter) 
{ 
    root = (StoryElement*) malloc(sizeof(StoryElement)); 

    root->title_of_chapter_ = 
    (char*)malloc(sizeof(char*)*(strlen(title_of_chapter) + 1)); 
    root->content_of_chapter_ = 
    (char*)malloc(sizeof(char*)*(strlen(title_of_chapter) + 1)); 

    //strcpy(NewStoryElement->title_of_chapter_, title_of_chapter); 
    //strcpy(NewStoryElement->content_of_chapter_, content_of_chapter); 
    title_of_chapter = root->title_of_chapter_; 
    content_of_chapter = root->content_of_chapter_; 

    root->path_a_ = NULL; 
    root->path_b_ = NULL; 

    return root; 
} 

:私は、以下の機能を使用して、それらをすべて初期化メインで:

StoryElement *readStoryFromFile (StoryElement *root, char *filename) 
{ 
    if(strcmp(filename, "-") == 0) 
    { 
    //printf("End reached\n"); 
    return 0; 
    } 
    FILE *file = fopen(filename, "r"); 

    if(!file) 
    { 
    printf("[ERR] Could not read file %s.\n", filename); 
    return 0; 
    } 

    long fsize = getFileSize(file); 

    char* storage = malloc(fsize + 1); 
    if(!storage) 
    { 
    printf("[ERR] Out of memory.\n"); 
    return 0; 
    } 

    fread(storage, fsize, 1, file); 
    storage[fsize] = '\0'; 
    fclose(file); 

    root = createStoryTree(root, storage); 

    free(storage); 

    return root; 
} 

そして、これは別の関数を使用しますが、上記の2つだけは、私が思うこの質問に関連するどの私のメインです:

int main (int argc, char *argv[]) 
{ 
    if (argc != 2) /* argc should be 2 for correct execution */ 
    { 
    printf("Usage: ./ass2 [file-name]\n"); 
    return (1); 
    } 

    StoryElement *root = NULL; 

    root = readStoryFromFile(root, argv[1]); 
    if(!root) 
    return 3; 

    printf("%p\n", root); 
    printf("%s\n", root->title_of_chapter_); 

    //printStoryTree(root); 
    freeStoryTree(root); 

    root = NULL; 

    return 0; 
} 

そして最後に私の問題は、主な機能で後2つのprintfを次のように返すことです: First pointer Address is ok I think, but the second printf should be "Kapitel_1.txt" は、なぜ私はここにゴミ値を取得していますか?これはセグメンテーション違反ですか?

+0

予期せぬ場所にエラーが発生すると、 'readStoryFromFile'を見て、それが返されて間違ったデータを出力するまでそれを追跡することができます。それを提供してください。 –

+0

名前に末尾のアンダースコアを使用することはお勧めできません。システムおよびライブラリ用に予約する必要があります。 –

+0

なぜ 'makeNewStoryElement'の2つの' strcpy'ステートメントをコメントアウトしましたか?実際、今は動作しません。 –

答えて

0

makeNewStoryElementの機能では、root->title_of_chapterのスペースをmallocしますが、指定されたtitle_of_chapterの内容は入れません。つまり、root->title_of_chapterには、mallocから返された場所にあるガベージデータがすべて含まれます。
strcpy(root->title_of_chapter, title_of_chapter);
のようにすると、printfは正常に機能します。
コードには他にもいくつか問題がありますが、あなたがしてはいけないことがありますが、これはあなたが求めている問題を解決するはずです。

+0

strcpy()関数を試しました(コメントアウトしたものの「root-> title_of_chapter_」)。しかし、別のフォールトのために別のプログラムがクラッシュする。おそらくcreateStoryTree関数からです。 – blablu

関連する問題