gpt4 book ai didi

c - 为什么 free 函数在我的代码中不起作用?

转载 作者:行者123 更新时间:2023-11-30 18:44:40 25 4
gpt4 key购买 nike

我试图释放“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;
}

最佳答案

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

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

其次是

*b = "tab";

说白了,你做错了。您正在覆盖 malloc 给您的动态分配指针(在此过程中丢失它),并将其替换为指向编译器分配的字符串“tab”的有效但非动态分配的指针。当您稍后调用 free(b[0])(相当于 free(*b))时,您传递给 free 的指针code> 是非动态分配的,而不是从 malloc 获得的——正如我所说,你丢失了。这就是您收到该投诉的原因。 (它实际上来自 C 运行时库,而不是来自编译器。)

要完成您想要做的事情,您将必须复制字符串,而不仅仅是分配指针。您还必须确保分配的区域足够大。 (请记住,字符串“tab”的大小为4,其中一个用于终止\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],尽管如果您确实想在退出前释放东西,您也需要释放 b[1]b[2],最后是 b。)

我还消除了对 malloc 返回值的一些不必要的转换,以及传递给它的大小中“sizeof(char)”的一些不必要的乘法。

关于c - 为什么 free 函数在我的代码中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57244944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com