2013-01-14 57 views
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) 

,但它会产生分段错误。

在此先感谢!

+3

您需要为您的对象分配内存。 – ouah

+0

'struct term * look = malloc(sizeof(* look));' – imreal

+0

实际上struct term是一个列表,我已经分配了一些节点,并且正在尝试打印它们。 struct term * look是我用来遍历列表的指针。 –

回答

2

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

您需要为struct以及其内的所有引用分配内存。

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

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成员是一个指针,所以你必须服从整个ŧ兴奋分配一个值。 (在这样做之前,你需要再次分配一些内存)

当你完成课程时,你可以释放所有的东西。