使用指针访问结构成员的垃圾数据

struct _StoryElement_ { 

char *title_of_chapter_;

struct _StoryElement_ *path_a_;

struct _StoryElement_ *path_b_;

char *content_of_chapter_;

};

typedef struct _StoryElement_ StoryElement;

因此,我创建了一个Tree,其中每个Structs都包含不同的值。我初始化它们都使用以下功能:使用指针访问结构成员垃圾数据

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;

}

此功能就是为我提供了我转嫁给insertIntoStoryElement()的字符串值:

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;

}

这是最终调用的函数主:

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个printfs输出后,在主函数返回以下内容: First pointer Address is ok I think, but the second printf should be "Kapitel_1.txt" 我为什么在这里得到一个垃圾的价值?这是分段错误吗?

回答:

在您的函数makeNewStoryElement中malloc为root->title_of_chapter指定的空间,但是您不会将给定的title_of_chapter的内容放入其中。这意味着root->title_of_chapter将包含您从malloc返回的位置中的任何垃圾数据。
做一些类似于 strcpy(root->title_of_chapter, title_of_chapter);
printf将会很好。
该代码还有其他一些问题和你不应该做的事情,但是这应该解决你所问的问题。

以上是 使用指针访问结构成员的垃圾数据 的全部内容, 来源链接: utcz.com/qa/257581.html

回到顶部