0
//char char **p; declared in .h file
size_t bs = 5;
size_t Size = sizeof(obj);
p = (char**)malloc(bs);
for (size_t i = 0; i < bs;i++){p[i] = (char*)malloc(Size);}

for (size_t j = 0; j < bs-1; j ++){p[j] = &(p[j + 1][0]); }

for (size_t i = 0; i < bs; i++){free(p[i]);}

free(p);

尝试释放 for 循环中 p 的最后一个元素时,我的代码停止运行。任何人我可能做错了什么?

编辑:即使将其更改为 (char* )malloc(bs sizeof(char *));我仍然有同样的问题

这仍然不起作用:

size_t bs = 5;
size_t Size = sizeof(obj);
p = (char**)malloc(bs* sizeof(char *));
for (size_t i = 0; i < bs;i++){p[i] = (char*)malloc(Size);}
for (size_t j = 0; j < bs-1; j ++){p[j] = &(p[j + 1][0]); }
for (size_t i = 0; i < bs; i++){free(p[i]);}
free(p);

使用 new 而不是 malloc 也不能解决问题

但是,此代码可以很好地释放内存。

size_t bs = 5;
size_t Size = sizeof(obj);
p = (char**)malloc(bs* sizeof(char *));
for (size_t i = 0; i < bs;i++){p[i] = (char*)malloc(Size);}
for (size_t i = 0; i < bs; i++){free(p[i]);}
free(p);

所以问题似乎与这段代码有关

for(size_t j = 0; j < bs-1; j ++){p[j] = &(p[j + 1][0]); }

我希望这是一个隐式链表,任何人都知道我做错了什么?

4

3 回答 3

2

您没有为指针分配足够的空间。改成

p = malloc(bs * sizeof(char*));
于 2014-01-24T21:20:10.940 回答
1

在第一个 malloc 中,您不需要 5 个字节,但需要 5 个指针。

p = (char**)malloc(bs * sizeof(char *));
于 2014-01-24T21:20:00.313 回答
1

问题是你:

  • 分配一个包含 5 个指针的数组
  • 分配 5 个字符数组并将它们存储在第一个数组中
  • 在数组中向下移动这些指针,覆盖(并丢失)第一个指针并复制最后一个
  • 尝试释放数组中的 5 个指针。

因此,在最后一步,您释放了两次指针(因为 和 的最后两个条目p[3]相同p[4]),导致未定义的行为。

您说您想要“一个隐式链表”,这意味着您正在尝试将指针填充到对象中(而不是像您正在做的那样填充到顶级数组中),在这种情况下您想要类似的东西:

for(size_t j = 0; j < bs-1; j ++) { *(char **)p[j] = p[j + 1]); }
*(char **)p[bs-1] = 0;  // null terminate the linked list

这假设obj定义如下:

struct obj {
    struct obj *next;
    // more fields
于 2014-01-24T22:42:08.580 回答