我在main.c文件中具有以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct mystruct {const char *name; int x;};
char *test_calloc_char_p(const char *char_p) {
return (char *) calloc(1, (strlen(char_p) + 1) * sizeof(char));
}
int main(void) {
struct mystruct *ms1;
ms1 = (struct mystruct *) calloc(1, sizeof(struct mystruct));
ms1->name = test_calloc_char_p("dlldffdl");
ms1->x = 3;
free(&ms1->name);
free(ms1);
return 0;
}
我用gcc main.c -o test
编译并用./test
运行,然后得到:
free(): double free detected in tcache 2
Abortado
我不明白,为什么?我不应该释放ms1->name
吗?因为当我对此行发表评论时我没有收到错误,但是为什么我不应该释放分配的内容?
这不正确:
free(&ms1->name);
ms1->name
的地址是分配给ms1
的已分配存储器的一部分。它是[[not name
成员的分配。
ms1->name
,因此应该将其传递给free
:free((char *)ms1->name);
请注意,需要进行强制类型转换,因为否则,您将向需要非const
指针的函数传递const
指针。可以通过将name
成员从const char *
更改为char *
来删除演员表。
代码应为
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct mystruct {const char *name; int x;};
int main(void) {
struct mystruct *ms1;
ms1 = (struct mystruct *) calloc(1, sizeof(struct mystruct));
ms1->name = strdup("dlldffdl");
ms1->x = 3;
free(ms1->name);
free(ms1);
return 0;
}
也您的函数test_calloc_char_p复制了strdup的功能