C 返回动态分配字符串的函数只工作一次,然后在后续调用中返回垃圾值(在调用free之后)

C 返回动态分配字符串的函数只工作一次,然后在后续调用中返回垃圾值(在调用free之后),c,C,都在标题里。我已经包括了屏幕截图来查看我的代码和输出。基本上,我调用一个函数,返回一个动态分配的字符串(char*),在main中打印它,它看起来很完美。然后释放该变量,再次调用该函数时,我得到一个垃圾输出,这看起来像是内存错误,但我不知道它可能来自何处。 感谢您的帮助,我被困了几个小时。 谢谢 抱歉,如果这些链接很烦人,我第一次发布的帖子您正在将结果构建到未初始化的字符串数组中: char result[200]; 未初始化的变量可能包含任何内容。可以在声明变量后立即添加空字符作为第一

都在标题里。我已经包括了屏幕截图来查看我的代码和输出。基本上,我调用一个函数,返回一个动态分配的字符串(char*),在main中打印它,它看起来很完美。然后释放该变量,再次调用该函数时,我得到一个垃圾输出,这看起来像是内存错误,但我不知道它可能来自何处。 感谢您的帮助,我被困了几个小时。 谢谢


抱歉,如果这些链接很烦人,我第一次发布的帖子

您正在将结果构建到未初始化的字符串数组中:

char result[200];

未初始化的变量可能包含任何内容。可以在声明变量后立即添加空字符作为第一个字符:

char result[200];
result[0] = '\0';

这样,第一个字符将是字符串终止符,字符串函数将按预期工作。

一旦调用free();函数可以释放先前分配用于存储字符串的内存,因此当运行代码时,它会抛出垃圾值,因为没有要打印的字符串(因为没有内存来存储该字符串)。一种可能的解决方案是确保每次调用函数时都为字符串分配足够的内存。

请记住,默认情况下,C编程语言不会初始化任何新变量,因此最好的做法是始终初始化所有内容:

117 char argcs[10] = { 0 };
118 char arguments[200] = { 0 };
119 char result[200] = { 0 };
120 char *result2 = NULL;
不使用malloc,您可以使用calloc并初始化新分配的内存:

154 result2 = calloc(sizeof(result));
这里的内存使用量很小,所以我做了一些更改以提高性能。 如果要使用大量内存,可能并不总是希望初始化所有内容,因为性能会受到影响,但是在这种情况下,可以继续并将所有内容设置为0

这里有一些关于如何使用strcat处理字符串的问题,如果输入大于200,则不检查以避免溢出。在那里使用字符串是非常不安全的


然而,最令人担忧的问题是当您返回放置在局部变量中的malloc地址时。由于您将指针地址存储在局部变量中,一旦您离开该功能,该本地存储将被释放,并且另一个内存分配可能会覆盖此先前定义的位置,从而有效地造成内存泄漏,并可能在执行时返回垃圾,或者在非常不幸的情况下,出现分段错误和核心转储

请将代码添加为问题的一部分,而不是捕获。请将代码作为文本编辑到问题中。非常感谢,正是这样。我想我还没有写下所有你需要用c正确编码的小东西。。。同样感谢您的回复,即使是图片,我一定会在我的下一篇文章中发布代码。
154 result2 = calloc(sizeof(result));