1

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

这是错误的代码:

#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

4 回答 4

2

你应该使用

(*tab)[i].a = i*8;

访问该字段a

于 2012-10-08T16:44:15.877 回答
1

请参阅realloc手册页。第二个参数是您要分配的数据大小;我认为您正在传递一个数组索引。

理想情况下,代码应采用以下形式

my_struct* tmp = realloc(*tab, sizeof(my_struct) * (i+1));
if (tmp == NULL) {
    /* error handling goes here */
else {
    *tab = tmp;
}

以应对 realloc 失败并返回 NULL。

于 2012-10-08T16:45:07.510 回答
1

就像做这个分配一样简单:

(*tab)[i].a = i*8;

如果你想摆脱圣。

于 2012-10-08T16:46:31.253 回答
0

不确定您要在这里实现什么。根据 realloc 文档,如果可能,它会尝试增加分配空间的大小,如果不是,它就像 free 和 malloc 一样。因此,在您的情况下,每次如果您尝试为结构分配空间,它将是相同的。但是根据代码,它第一次是 0 字节,它会尝试释放(分配的内存是空的,段错误也是如此)。

另外,您所说的修复似乎不是修复。它仍然会在以后的某个时候死去。因为堆栈在第一次调用时就已经损坏了。

于 2012-10-08T16:57:11.990 回答