Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C函数创建结构的动态数组_C_Struct_Indexing_Dynamic Allocation - Fatal编程技术网

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

C函数创建结构的动态数组,c,struct,indexing,dynamic-allocation,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, &

有人能帮我处理这段代码吗?我省略了分配支票以保持简短

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
}

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

这是因为在调用
realloc
时,您没有将
p\u大小
乘以
sizeof(MYSTRUCT)
,也没有将结果分配回
p\u点

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

  • 您不需要在C中强制转换
    malloc
    realloc
    的结果
  • 对于一致性,考虑将<代码>大小>代码> <代码> init <代码>,并将其设置为<代码> 1 /代码>。

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

MYSTRUCT *point;
您将
声明为指向
MYSTRUCT
结构(或其数组)的指针

语法
point[i]
相当于
*(point+i)
——换句话说,它在添加了适当的偏移量后已经解除了对指针的引用,从而生成了一个
MYSTRUCT
对象,而不是指向该对象的指针

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


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

谢谢您的快速回答。正如您所说,我已经修复了realloc(),但仍然不能使用索引符号。我需要它,因为在下一步中,我想生成填充数组x和y的函数。@Imp您需要使用
,而不是
->
,因为
点[1]
MYSTRUCT
本身,而不是指向
MYSTRUCT
的指针。谢谢。它起作用了。我试着做其他的功能,希望它能工作。