访问三个嵌套结构中最内层的指针成员变量

时间:2013-01-14 21:07:43

标签: c

typedef struct {

   struct {
      double i1, i2;
   } EXP;

   struct {
      double i1, i2;
   } SIN;

   struct {
      double i1, i2;
   } PULSE;

   struct {
      double *i1, *i2;
   } PWL;
} TRANS;

struct term {
   TRANS trans;
   struct term *nxt;
};

int main() {
   struct term *look;
}

我有上面的结构,指针指向结构术语。有人能告诉我如何在struct PWL中取消引用指针i1吗?

我试过这个:

*(look->trans.PWL.i1)

但它会产生分段错误。

提前致谢!

2 个答案:

答案 0 :(得分:2)

分段错误是因为您分配了一个指针,但没有为指向指针的指针创建内存。一旦你这样做,那么*(look->trans.PWL.i1)确实是如何访问内部结构中的那个字段。

您需要为结构以及。

中的所有引用分配内存
struct term *look = malloc(sizeof(struct term));
look->trans.PWL.i1 = malloc(sizeof(double));
look->trans.PWL.i2 = malloc(sizeof(double));

当你完成时,你需要通过调用free来反转这个过程。

free(look->trans.PWL.i2);
free(look->trans.PWL.i1);
free(look);

或许,i1i2可能指向其他地方分配的值,然后它会如下所示:

struct term *look = malloc(sizeof(struct term));
look->trans.PWL.i1 = &look->trans.EXP.i1;
look->trans.PWL.i2 = &look->trans.EXP.i2;

要解除分配你的免费look。请务必将每次成功通话与malloc调用free

答案 1 :(得分:0)

特定于PWL.i1

int main() {
   struct term *look;                   // set up your variable
   look = malloc(sizeof(struct term));  // give it some memory
   look->trans.PWL.i1 = malloc(sizeof(double)); //give some memory to your double pointer
   *(look->trans.PWL.i1) = 5.0;         // assign it a value
   printf("%lf\n", *(look->trans.PWL.i1));
   return 0;
}

因为look是指向term结构的指针,这意味着当你访问它的元素时,你需要尊重它,然后一旦你拥有它就访问成员(->)只需通过.运营商访问其他成员:

look->trans.PWL.i1

在这种情况下,PWL的i1成员是一个指针,所以你必须遵循整个事情来分配一个值。 (在这之前,你需要再分配一些内存)

当你完成任务时,释放一切。