如何解决realloc 在通过引用传递数组时不起作用
我有以下代码:
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() 参数始终指向单个 foo *(分配在 main 的堆栈上)。该程序的明显意图是 main 中的单个 foo * 应该指向一个包含一个或多个 foo 实例的数组。
以下行假设 bar() 的参数 a 指向至少 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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。