为什么自由函数在我的代码中不起作用?

时间:2019-07-28 21:02:38

标签: c

我试图释放“ b”数组的第一行,但是编译器抛出错误“ free():无效的指针。异常终止”

#include <stdlib.h>
#include <stdio.h>

void    ft_edit(char ***tab)
{
    **tab = "hel";
}

int    main(void)
{
    char **b;

    b = (char **)malloc(sizeof(char *) * 3);
    *b = (char *)malloc(3 * sizeof(char));
    *(b + 1) = (char *)malloc(3 * sizeof(char));
    *b = "tab";
    *(b + 1) = "tac";
    printf("Before: %s\n", *b);
    ft_edit(&b);
    free(b[0]);
    printf("After: %s\n", *b);
    printf("%s", *(b + 1));
    return 0;
}

1 个答案:

答案 0 :(得分:2)

使用字符串和指针时,必须保持直率的一件事是可以分配指针,而要在不同的指针之间显式复制内容。特别是当你说

*b = (char *)malloc(3 * sizeof(char));

之后

*b = "tab";
坦率地说,您做错了。您将覆盖给您的动态分配指针malloc(在过程中丢失),并用有效但非动态分配的指向编译器分配的字符串“ tab”的指针替换它。当您稍后调用free(b[0])(与free(*b)等效)时,您要传递给free的指针是非动态分配的指针,而不是从{{ 1}}-正如我所说,您输了。这就是为什么您会收到投诉。 (它实际上来自C运行时库,而不是来自编译器。)

要做您想做的事情,您将不得不复制字符串,而不仅仅是分配指针。您还必须确保分配的区域足够大。 (请记住,字符串“ tab”的大小为 4 ,其中包括一个用于终止malloc字符的字符串。)

这是更正的版本。

\0

我将通话移至void ft_edit(char ***tab) { strcpy(**tab, "hel"); } int main() { char **b; b = malloc(sizeof(char *) * 3); b[0] = malloc(10); b[1] = malloc(10); b[2] = malloc(10); strcpy(b[0], "tab"); strcpy(b[1], "tac"); printf("Before: %s\n", b[0]); ft_edit(&b); printf("After: %s\n", b[0]); printf("%s\n", b[1]); free(b[0]); return 0; } 的末尾,因为您不想在打印前释放free。 (话虽如此,实际上没有必要释放b[0],尽管如果您要做想要在退出前释放东西,那么您也将希望释放b[0],{{ 1}},最后是b[1]。)

我还摆脱了b[2]的收益上的一些不必要的强制转换,以及传递给它的大小与`sizeof(char)的不必要的乘法。