2

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

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* datadeepest_t deepest. 我试过这样的解决方案,但编译器尖叫它不是一个 const 值:

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

2 回答 2

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*因为在你施放它之前你不能使用它..

这是现场执行

于 2013-06-19T06:02:34.227 回答
0

如果初始化器用于初始化static存储持续时间的变量,它应该是一个常量表达式,因此您不能这样做。

如果它用于初始化局部非static变量,则可以使用此初始化器:

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

假设您想要您在文本中所说的内容(“指向deepest_t deepest”)。

什么是常量表达式,您可以在这里阅读: 详细说明什么是 C 中的常量表达式?

于 2019-03-16T12:13:49.213 回答