有人可以帮助这段代码吗?我放弃了分配检查以保持简短。
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
}
我不明白为什么索引符号在调用函数后不起作用。
答案 0 :(得分:2)
这是因为您在p_size
的调用中没有将sizeof(MYSTRUCT)
乘以realloc
,而不是将结果分配回p_point
:
*p_point = realloc(*p_point, *p_size * sizeof(MYSTRUCT));
注意:
malloc
或realloc
的结果。&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
,但这种可读性要差得多......