我遇到了大量代码的问题,所以我尽可能地减少了它,事实上我找到了解决问题的方法,但我几乎可以肯定有更好的解决方案,这就是为什么我正在寻求帮助。
这是错误的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int a;
}my_struct;
void tab_add(my_struct** tab, int i){
*tab = (my_struct*)realloc(*tab, i+1); // Here's the realloc
printf("Adding struct number %d\n", i);
tab[i]->a = i*8; // Problem here, when accessing tab[i] the second time
printf("Struct added\n");
}
int main(void){
my_struct* tab = NULL;
tab_add(&tab, 0);
tab_add(&tab, 1);
tab_add(&tab, 2);
return 0;
}
输出结果为:
添加结构编号0
结构添加了 添加结构编号1
zsh:分段错误./main
现在,这是一个解决问题的代码(但它会创建一个无用的变量......):
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int a;
}my_struct;
void tab_add(my_struct** tab, int i){
*tab = (my_struct*)realloc(*tab, i+1);
printf("Adding struct number %d\n", i);
my_struct st; // Useless variable created
st.a = i*8;
(*tab)[i] = st;
printf("Struct added\n");
}
int main(void){
my_struct* tab = NULL;
tab_add(&tab, 0);
tab_add(&tab, 1);
tab_add(&tab, 2);
return 0;
}
它的输出是正确的:
添加结构编号0
结构添加了 添加结构编号1
结构添加了 添加结构编号2
结构添加
感谢阅读:)
答案 0 :(得分:2)
你应该使用
(*tab)[i].a = i*8;
访问字段a
答案 1 :(得分:1)
请参阅realloc手册页。第二个参数是您要分配的数据大小;我认为你正在传递一个数组索引。
理想情况下,代码应为
形式my_struct* tmp = realloc(*tab, sizeof(my_struct) * (i+1));
if (tmp == NULL) {
/* error handling goes here */
else {
*tab = tmp;
}
应对realloc失败并返回NULL。
答案 2 :(得分:1)
这就像做这个任务一样简单:
(*tab)[i].a = i*8;
如果你想摆脱圣
答案 3 :(得分:0)
不确定你想要在这里实现什么。根据realloc文档,如果可能的话,它会尝试增加已分配空间的大小,如果不是就像free和malloc那样。因此,在您的情况下,每次如果您尝试为结构分配空间,它将是相同的。但根据代码,它是第一次0字节,它将尝试释放(分配的内存是无,所以是seg错误)。
另外你说的修复似乎不是一个修复。它会在某个时候死掉。因为堆栈在第一次调用时已经损坏了。