free():在tcache 2中的const char *中检测到了double free *

问题描述 投票:0回答:1

我在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吗?因为当我对此行发表评论时我没有收到错误,但是为什么我不应该释放分配的内容?

c dynamic-memory-allocation calloc
1个回答
0
投票

这不正确:

free(&ms1->name);

ms1->name的地址是分配给ms1的已分配存储器的一部分。它是[[not name成员的分配。

您已将分配的内存分配给ms1->name,因此应该将其传递给free

free((char *)ms1->name);

© www.soinside.com 2019 - 2024. All rights reserved.