C函数用于创建动态结构数组

时间:2014-05-21 15:18:20

标签: c struct indexing dynamic-allocation

有人可以帮助这段代码吗?我放弃了分配检查以保持简短。

typedef struct {
  int x;
  int y;
} MYSTRUCT;

void init(MYSTRUCT **p_point);
void plusOne(MYSTRUCT **p_point, int *p_size);

int main()
{
  MYSTRUCT *point;
  int size = 1;

  init(&point);

  plusOne(&point, &size);
  plusOne(&point, &size);

  point[1]->x = 47;  //  this was the problem
  point[1].x = 47;   //  this is solution    

  return 0;
}

void init(MYSTRUCT **p_point)
{
  *p_point = (MYSTRUCT *) malloc( sizeof(MYSTRUCT) );
}

void plusOne(MYSTRUCT **p_point, int *p_size) 
{
  (*p_size)++;

  *p_point = realloc(*p_point, *p_size * sizeof(MYSTRUCT) ); // also calling to the function is fixed
}

我不明白为什么索引符号在调用函数后不起作用。

2 个答案:

答案 0 :(得分:2)

这是因为您在p_size的调用中没有将sizeof(MYSTRUCT)乘以realloc,而不是将结果分配回p_point

*p_point = realloc(*p_point, *p_size * sizeof(MYSTRUCT));

注意:

  • 您无需在C中投射mallocrealloc的结果。
  • 为保持一致性,请考虑将&size传递给init,并将其设置为1

答案 1 :(得分:0)

你有一些类型混乱...在这里:

MYSTRUCT *point;

您声明point是指向MYSTRUCT结构(或其数组)的指针。

语法point[i]等同于*(point + i) - 换句话说,它在添加适当的偏移量后已经取消引用指针,产生MYSTRUCT对象,而不是指向一个对象的指针

语法p->x相当于(*p).x。换句话说,它还希望p是一个指针,它会解除引用,然后从结构中生成请求的字段。

但是,由于point[i]不再是指向MYSTRUCT的指针,因此使用->是错误的。您要找的是point[i].x。您也可以使用(point + i) -> x,但这种可读性要差得多......