我试图释放“ 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;
}
答案 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)的不必要的乘法。