【问题标题】:C functions to create dynamic array of structs用于创建结构的动态数组的 C 函数
【发布时间】:2014-05-21 15:18:20
【问题描述】:

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

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
}

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

【问题讨论】:

    标签: c struct indexing dynamic-allocation


    【解决方案1】:

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

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

    注意事项:

    • 您不需要在 C 中转换 mallocrealloc 的结果。
    • 为了保持一致性,请考虑将&size 传递给init,然后在此处将其设置为1

    【讨论】:

    • 感谢您的快速回答。正如你所说,我已经修复了 realloc() 但仍然不能使用索引表示法。我需要它,因为在下一步中我想创建填充数组 x 和 y 的函数。
    • @the_Imp 你需要使用.,而不是->,因为point[1]本身就是MYSTRUCT,而不是指向MYSTRUCT的指针。
    • 谢谢。有用。我尝试制作其他功能,希望它能起作用。
    【解决方案2】:

    你有一些类型混淆...这里:

    MYSTRUCT *point;
    

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 2020-04-14
      • 2017-03-13
      • 1970-01-01
      相关资源
      最近更新 更多