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

时间:2019-02-07 05:24:57

标签: c

真的都是标题。我提供了截屏以查看代码和输出。基本上,我调用一个函数,该函数返回动态分配的字符串(char *),在main中将其打印出来,看起来很完美。然后释放变量,再次调用该函数,我得到一个垃圾输出,这似乎是一个内存错误,但我不知道它可能从哪里来。 感谢任何帮助,被困了几个小时。 谢谢!

function main output

抱歉,这些链接很烦人,我是第一次发布

3 个答案:

答案 0 :(得分:0)

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

char result[200];

...

strcat(result, ...);

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

请记住,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的地址时。由于您将指针地址存储在本地变量中,因此一旦离开该函数,该本地存储将被释放,另一个内存分配可能会覆盖此先前定义的位置,从而有效地造成内存泄漏并可能在执行过程中或在非常不幸的情况下返回垃圾分段故障和核心转储。