繁体   English   中英

C函数创建结构的动态数组

[英]C functions to create dynamic array of structs

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

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
}

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

这是因为你没有乘以p_size通过sizeof(MYSTRUCT)中的呼叫realloc ,而不是分配结果返回p_point

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

笔记:

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

您在进行一些类型混淆...这里:

MYSTRUCT *point;

您声明point为一个指向MYSTRUCT结构(或它们的数组)的指针。

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

语法p->x等效于(*p).x 换句话说,它还期望p是一个指针,将其取消引用,然后从该结构产生所请求的字段。

但是,由于point[i]不再是指向MYSTRUCT的指针, MYSTRUCT在其上使用->是错误的。 您正在寻找的是point[i].x 您也可以使用(point + i) -> x ,但是它的可读性很差...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM