我应该如何通过免费传递 const char 指针来释放 char 指针?
How should I release a char pointer by passing a const char pointer for free?
我在 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
的已分配内存的一部分。 不是 name
成员的分配。
您已将分配的内存分配给 ms1->name
,因此您应该将其传递给 free
:
free((char *)ms1->name);
请注意,强制转换是必需的,否则您会将 const
指针传递给需要非 const
指针的函数。可以通过将 name
成员从 const char *
更改为 char *
.
来删除演员表
&ms1->name 指向结构中第一个字段的地址,即它指向 ms1 本身。
所以 ms1 和 &ms1->name 指向同一个地址
代码应该是
#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
的功能
我在 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
的已分配内存的一部分。 不是 name
成员的分配。
您已将分配的内存分配给 ms1->name
,因此您应该将其传递给 free
:
free((char *)ms1->name);
请注意,强制转换是必需的,否则您会将 const
指针传递给需要非 const
指针的函数。可以通过将 name
成员从 const char *
更改为 char *
.
&ms1->name 指向结构中第一个字段的地址,即它指向 ms1 本身。 所以 ms1 和 &ms1->name 指向同一个地址
代码应该是
#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
的功能