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
的指针。谢谢。它起作用了。我试着做其他的功能,希望它能工作。