したがって、それぞれ異なる値を含むこれらの構造体のツリーがあります。ポインタを使用して構造体メンバにアクセスする際のガベージデータ
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" は、なぜ私はここにゴミ値を取得していますか?これはセグメンテーション違反ですか?
予期せぬ場所にエラーが発生すると、 'readStoryFromFile'を見て、それが返されて間違ったデータを出力するまでそれを追跡することができます。それを提供してください。 –
名前に末尾のアンダースコアを使用することはお勧めできません。システムおよびライブラリ用に予約する必要があります。 –
なぜ 'makeNewStoryElement'の2つの' strcpy'ステートメントをコメントアウトしましたか?実際、今は動作しません。 –