0
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)

但它会产生分段错误。

提前致谢!

4

2 回答 2

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);

或者,也许i1并且i2意味着指向在其他地方分配的值,那么它看起来像这样:

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

并释放你只是 free look。请记住将每个成功malloc的呼叫与呼叫配对free

于 2013-01-14T21:18:58.783 回答
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成员是一个指针,因此您必须尊重整个事物才能分配一个值。(在这样做之前,您需要再次在那里分配一些内存)

当然,当你完成后释放一切。

于 2013-01-14T21:22:36.520 回答