为什么我的free()函数不起作用(代码如下)

时间:2018-01-15 07:13:55

标签: c free dynamic-allocation

请转到第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

2 个答案:

答案 0 :(得分:3)

它可能会失败,因为您似乎忘记了C中的char字符串实际上被称为 空终止 字节字符串 。那个 null-terminator 部分非常重要,它需要一个额外的字节,否则你会写出界限。

越界越远导致undefined behavior,并且可能会覆盖内存分配器使用的内部数据free“无法正常工作”。

答案 1 :(得分:1)

c中的首先字符串是空终止char数组。你没有足够的空间来存储它们。此外,您没有为已连接的空白分配足够的空间。通过写入未由您分配的内存来说长话短说,已经调用了未定义的行为。

还不清楚如何说free()呼叫失败。你不释放记忆的想法是什么?

例如,在这种情况下,您可以考虑两个有助于分配足够内存的事情。 strcatstrcpy都会考虑\0strcat覆盖源字符串中的\0

此外,您的代码中存在许多问题 - 从不分配足够的内存开始 - 转换malloc的返回值,而不是取消malloc的返回值并使用scanf长度修饰符。