如何用C99中的另一个struct成员初始化void * data struct成员?

时间:2013-04-25 14:27:09

标签: c pointers struct c99 designated-initializer

让我们假设我们有以下结构定义:

typedef struct {
  uint8_t a ; 
} deepest_t ;  

typedef struct {
  deepest_t* deepest_ptr ;
} deeper_t ; 

typedef struct {
  deeper_t*  deeper_ptr ;
} deep_t ; 

typedef struct {
  void* data ;
} data_container_t ; 

并在初始化之后:

deepest_t deepest = {
  .a = 5, 
} ; 

deeper_t deeper = { 
  .deepest_ptr = &deepest, 
} ;

deep_t deep = { 
  .deeper_ptr = &deeper,
} ;

现在问题,您能告诉我如何使用指定的初始化程序初始化void* data,以便void* data指向deepest_t deepest。我已经尝试过这样的解决方案,但编译器尖叫它不是const值:

data_container_t data_container = {
  .data = &(((deeper_t*) deep.deeper_ptr)->deepest_ptr),
} ; 

2 个答案:

答案 0 :(得分:0)

在这里,我相信你保留了deepest_ptr ..

的地址
data_container_t data_container = {
  .data = &(((deeper_t*) deep.deeper_ptr)->deepest_ptr),
} ;

所以要检索它,你可以这样做..

deepest_t * d = *((deepest_t**)(data_container.data));

printf(" %ud \n", (*d).a);

因为在你投射之前你不能使用void* ..

这里是live execution

答案 1 :(得分:0)

如果使用初始化程序来初始化static存储持续时间的变量,则该变量应为常量表达式,因此您不能这样做。

如果用于初始化本地非static变量,则可以使用此初始化程序:

data_container_t    data_container  = {
    .data   = (deep.deeper_ptr)->deepest_ptr,
};

假设您要在文本中说出来(“指向deepest_t deepest”)。

您可以在这里阅读什么是常量表达式: Details of what constitutes a constant expression in C?