通过引用传递数组时 realloc 不起作用

realloc does not work while passing an array by reference

我有以下代码:

typedef struct{
  int *array;
  int n;
}foo;


void bar(foo **a, int i)
{
  a[i]->array = malloc(sizeof(int)*10);
  *a = realloc(*a,(i+2)*sizeof(foo));
}

int main() {
  foo *a;
  int i;
  a = malloc(sizeof(foo));
  for (i=0; i<2; i++) bar(&a, i);
}

在我的第二次迭代 (i=1) 中,我在命令中遇到分段错误

a[i]->array = malloc(sizeof(int)*10);

这怎么可能?该数组必须有 2 个元素,因为我已经完成了 realloc 并且我已经通过引用传递了该数组。有什么想法吗?

提前致谢!

在 C 中,像 foo **a 这样的声明有点模棱两可,因为它实际上并没有告诉你有多少 foo * 值或每个 foo *foo * 指向多少 foo 值。这必须从上下文中推断出来。例如,main 中的 argc 告诉一个人期望 argv 指向多少个指针。

在您简洁的最小可重现示例中,调用 bar() 时,a 参数 bar() 始终指向一个single foo * (分配在 main 的堆栈上)。该程序的明显意图是 main 中的单个 foo * 应该指向一个包含一个或多个 foo.[=12 实例的数组=]

下一行假设参数 abar() 至少指向一个数组 i+1 foo * 指针。它恰好在 i == 0 时起作用,因为总是只有一个 foo *,但在 i > 0 时不起作用,因为永远不会超过一个 foo *.

a[i]->array = malloc(sizeof(int)*10);

要修复该语句,使其始终使用第一个且唯一的 foo*,并期望单个 foo* 指向 foo 数组,请将其更改为以下内容:

(*a)[i].array = malloc(sizeof(int)*10);