通过引用传递数组时 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 实例的数组=]
下一行假设参数 a 到 bar() 至少指向一个数组 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);
我有以下代码:
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 实例的数组=]
下一行假设参数 a 到 bar() 至少指向一个数组 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);