【发布时间】:2013-04-19 12:09:17
【问题描述】:
假设我们有以下结构定义:
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),
} ;
【问题讨论】:
-
你不能。为什么你认为你应该能够?初始化程序应该是常量。对象值(在您的情况下为
deep.deeper_ptr)不是常量。即使只是用一个常量初始化,还没有机会改变,它仍然不是一个常量。 -
作为切线,这里的演员表完全是多余的,并且您的描述与您的代码不匹配(您说您想将
data指向deepest,但代码试图将其指向@ 987654330@。避免强制转换和void*将有助于减少此类事情。 -
我真的做不到吗?但是
deepest变量的地址或deepest_ptr所在的地址是已知的,它是const,这就是我想要得到的。 -
认为
((deeper_t*) deep.deeper_ptr)->deepest_ptr是deepest_t *。因此,&(((deeper_t*) deep.deeper_ptr)->deepest_ptr)必须是deepest_t **。根据您的问题,deepest_t **如何指向deepest?不要使用_t后缀;这是为实现保留的。 -
您指的不是
deepest的地址。您指的是由隐藏在deep.deeper_ptr中的指针指向的东西,然后获取该东西的deepest_ptr成员,然后获取该成员的地址。如果您想要deepest的地址,请说&deepest。
标签: c pointers struct c99 designated-initializer