释放malloc不会删除char数据

我做了一个更大问题的小方案。 我尝试做的是将一个字符串传递给一个函数,该函数将从中生成一个新的字符串。 但是我遇到了一些问题。

我已将字符串定义为

typedef char string[1024]; 

然后我有一个函数,它接受一个字符串并生成一个新的字符串,用旧的字符串和一个点字符填充

 string* add_sth_to_string(char* msg){ string* newStr=malloc(sizeof(string)); // malloc a newStr strcpy(*newStr, msg); // copying msg to newStr char buff[1024]; // making a buffer strcat(buff, "."); // adding a dot to buffer strcat(buff, *newStr); // adding msg to buffer strcpy(*newStr, buff); // copying buffer to newStr return newStr; } 

然后在main中我尝试每次使用此函数3次换一个新字符串:

 for (i=0; i<3; i++){ string* newStr; newStr=add_sth_to_string("test"); printf("str: %s\n", *newStr); free(newStr); // can even printf here } 

这是我得到的奇怪输出:

 str: .test str: .test.test str: .test.test.test 

当我希望得到:

 str: .test str: .test str: .test 

谁可以指出发生了什么? 我觉得奇怪的是,我可以在释放后立即打印newStr的值。

您正在使用buff而不初始化它。 尝试:

 char buff[1024]; buff[0] = 0; 

我觉得奇怪的是,我可以在释放后立即打印newStr的值。

释放后访问内存是未定义的行为 。 通常,出于性能原因, free不会将内存归零。

这是同一个问题中2个未定义行为的情况+一个非常奇怪的typedef 。 保持!

尝试改变

 strcat(buff, "."); 

 strcpy(buff, "."); 

或者在声明它时可选择地初始化buff

  char buff[1024] = ""; 

你应该在每次迭代时清除buf[1024]内容。


UPDATE

因为在堆栈上分配时, buf[1024]不会自动归零。 并且你选择strcat来连接两个字符串,它会找到一个\0 -terminate。 因此,如果buf包含一些默认值,它将引入混淆输出。

使用buf[1024] = ""; 分配缓冲区将纠正输出。

 string* newStr=malloc(sizeof(string)); // malloc a newStr strcpy(*newStr, msg); // copying msg to newStr 

这也会崩溃。 string是一个指针,因此它的sizeof将返回4或8,而不是你想要做的。

好吧,忘了我做了一个typedef的评论,但是我在这里告诉你为什么typedef是个主意。 乍一看它模糊了这个事实,它是一个数组而不是一个指针,在30行程序上它不是问题,但是当你必须维护一个200 000行项目(就像我一样),你会开始讨厌这些有点事。

另一点,你应该避免使用1024字节的固定大小的字符串。 1024并不是那么大(即使是80年代的家用电脑也有比这更大的屏幕),对于大多数人来说,如果字符串相当短,你就会浪费大量的内存。