在动态结构数组上使用realloc时出现Segfault错误

时间:2012-10-08 16:39:48

标签: c segmentation-fault realloc

我遇到了大量代码的问题,所以我尽可能地减少了它,事实上我找到了解决问题的方法,但我几乎可以肯定有更好的解决方案,这就是为什么我正在寻求帮助。

这是错误的代码:

#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
  结构添加

感谢阅读:)

4 个答案:

答案 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错误)。

另外你说的修复似乎不是一个修复。它会在某个时候死掉。因为堆栈在第一次调用时已经损坏了。