我应该如何通过免费传递 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

的功能