我正在尝试通过指针的指针从结构中访问字段
我尝试过:
(**vform).vpolygon->point->x = 1;
但是没有用。
代码:
typedef struct point{
int x;
}point;
typedef struct polygon{
point *point;
}polygon;
typedef struct form{
polygon **polygon;
}form;
void main(){
polygon *vpolygon;
form **vform;
vpolygon = (polygon *)malloc(sizeof(polygon)*5);
vform = (form **)malloc(sizeof(form)*5);
vpolygon->point->x = 1;
vform->vpolygon->point->x = 1;
}
我希望程序可以编译,但是实际输出是
18:12: error: '*vform' is a pointer; did you mean to use '->'?
vform->vpolygon->point->x = 1;
^~
->
答案 0 :(得分:1)
下面的代码应按照您想要的方式进行编译。但是,您所做的很多问题可能不会立即显现出来,但我将在下面进行介绍。
typedef struct point {
int x;
} point;
typedef struct polygon {
// dynamically allocated array of point
point *point;
} polygon;
typedef struct form {
// dynamically allocated array of polygon
polygon *polygon;
} form;
form *vform;
vform = malloc(sizeof(form) * 5);
vform->polygon = malloc(sizeof(polygon) * 5);
vform->polygon->point = malloc(sizeof(point) * 5);
vform->polygon->point->x = 1;
第一个问题是您正在将变量与结构的成员混合在一起。您的form
结构没有名为“ vpolygon”的元素。仅仅因为您的“ vpolygon”变量是polygon
结构,并不意味着您可以通过将其称为“ vpolygon”来突然引用polygon
变量的form
成员。
第二,您要转换malloc
的返回值。不要这样参见do I cast the result of malloc
第三,您的表单malloc
为5个表单结构分配了足够的内存,但将结果强制转换为指向表单的指针。 malloc可能应该是malloc(sizeof(form *) * 5)
,但我猜您实际上是指(vform *)malloc...
而不是(vform **)malloc...
。
第四,您正在动态分配数组并将变量指向数组中的第一个元素,但是您似乎没有任何机制来检测数组的大小。您需要一种方法来跟踪数组的大小,以免因意外离开数组的末端而导致分段错误。 (三种常见方法:1)跟踪分配的元素数。 2)用一些标记值标记数组的末端,并检查是否3)对其进行硬编码。都需要权衡)
第五。您想存储malloc
返回的原始值,以便可以在某个时刻free
使用它-如果修改vfrom
指向的内容,则会丢失该原始地址并导致内存泄漏。