我尝试通过函数中的复合文字来初始化结构。在解决了我的部分问题之后(请参阅在函数内部使用复合文字来初始化 C 中的变量),我遇到了一个新问题,其中一个成员 ( ptr_mb
) 必须是指向变量的指针。
这是代码:
typedef struct {
int i_mb;
int * ptr_mb;
} my_struct_t;
void init_struct(my_struct_t **my_struct, int * const ptr) {
*my_struct=&(static my_struct_t) {.i_mb=3, .ptr_mb= ptr};
}
int main() {
int a;
my_struct_t *my_struct;
// my_struct = &(my_struct_t) {.i_mb=3, .ptr_mb=&a}; It is OK
// Try to initialize it in a function
init_struct(&my_struct, &a);
}
在 中main()
,它有效(参见程序中的注释行)
发出编译错误。在函数 中init_struct
,ptr 不是常量(行*my_struct=&(static my_struct_t) {.i_mb=3, .ptr_mb= ptr};
:)。
a
是在 中声明的变量main()
。因此,它的地址是恒定的。我试着用、、、……来表现出矫揉造作的感觉。(int const *)
有时(int * const)
这(int const * const)
是无稽之谈,但只是尝试却没有任何效果。
是否可以在函数中按照其工作方式进行此类初始化main()
?
(使用了 Rq.。static
我知道这是一个 C23 标准,并且该标准尚未发布;有关详细信息,请参阅此答案:Use ofcompoundliteral inside a function to init a variable in C。)
它不起作用的原因与它不起作用的原因相同:
人们必须认识到静态存储持续时间变量的初始化发生在
main()
调用之前,而不是在声明所在的行。并且由于具有自动存储持续时间,因此在调用a
之前它没有地址 。main()
在主流系统上,a
此时在堆栈上分配。接下来我们必须意识到,如果
a
有固定地址并不重要,即使我们将其更改为static int a;
. 因为int * const ptr
不是地址常量,地址常量是某种类型常量表达式的正式术语。C23 6.6:现在等一下...
int a
在 main() 中或者&a
以上都不是。所以这条线其实也不行。该代码之所以有效,是因为 gcc/clang 中实现定义的扩展,但它并不严格符合 C,并且不可移植。
只需在初始化期间不要执行此操作即可。添加一项作业。