让我们假设我们有以下结构定义:
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),
} ;
答案 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*
..
答案 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?