请转到第29行并阅读评论。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char* messenges[5];
char* allstrings;
register int i;
int total = 0;
for (i = 0; i < 5; i++)
{
printf("Enter a string: ");
messenges[i] = (char*)malloc(5 * sizeof(char));
scanf("%s", messenges[i]);
total += strlen(messenges[i]);
}
allstrings = (char*)malloc(total);
strcpy(allstrings, messenges[0]);
for (i = 1; i < 5; i++)
{
strcat(allstrings, " ");
strcat(allstrings, messenges[i]);
}
printf("%s", allstrings);
free(allstrings); // This does not work..WHY?(Visual Studio 2015)
for (i = 0; i < 5; i++)
{
free(messenges[i]);// This works fine.
}
getch();
return 0;
}
以上代码不会释放 allstrings ,但可以免费 messenges [i] 。为什么它不适用于 allstrings ?
答案 0 :(得分:3)
它可能会失败,因为您似乎忘记了C中的char
字符串实际上被称为 空终止 字节字符串 。那个 null-terminator 部分非常重要,它需要一个额外的字节,否则你会写出界限。
越界越远导致undefined behavior,并且可能会覆盖内存分配器使用的内部数据free
“无法正常工作”。
答案 1 :(得分:1)
c中的首先字符串是空终止char
数组。你没有足够的空间来存储它们。此外,您没有为已连接的空白分配足够的空间。通过写入未由您分配的内存来说长话短说,已经调用了未定义的行为。
还不清楚如何说free()
呼叫失败。你不释放记忆的想法是什么?
例如,在这种情况下,您可以考虑两个有助于分配足够内存的事情。 strcat
和strcpy
都会考虑\0
和strcat
覆盖源字符串中的\0
。
此外,您的代码中存在许多问题 - 从不分配足够的内存开始 - 转换malloc
的返回值,而不是取消malloc
的返回值并使用scanf
长度修饰符。