从指针到指针的访问值

时间:2019-05-01 01:57:07

标签: c pointers struct

我正在尝试通过指针的指针从结构中访问字段

我尝试过:

(**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;
            ^~
            ->

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指向的内容,则会丢失该原始地址并导致内存泄漏。