引用在其初始化程序中初始化的结构是否安全?

Mar*_*kas 6 c struct initialization

说我有这种类型:

struct Bitmap
{
    int w, h, *b;
};
Run Code Online (Sandbox Code Playgroud)

我正在初始化它像这样:

int w = 7, h = 4;
struct Bitmap bmp = {w, h, calloc(bmp.w * bmp.h, sizeof(*bmp.b))};
Run Code Online (Sandbox Code Playgroud)

是否保证编译器将按struct顺序初始化?我可以确定在bmp.b字段初始化时bmp.w,bmp.h字段已经初始化了吗?

R S*_*ahu 8

运用

Bitmap bmp = {w, h, calloc(bmp.w * bmp.h, sizeof(*bmp.b))};
Run Code Online (Sandbox Code Playgroud)

是未定义的行为.C99标准中有两个项目可以解决这个问题.

6.7.8.初始化

...

19初始化应在初始化器列表顺序中进行,每个初始化器为特定子对象提供,覆盖同一子对象的任何先前列出的初始化器.

...

23未指定初始化列表表达式中出现任何副作用的顺序.133)

和脚注133说:

特别是,评估顺序不必与子对象初始化的顺序相同

它们的意思是,它们bmp.w之前将被初始化bmp.h.但是,有可能calloc(bmp.w * bmp.h, sizeof(*bmp.b))在之前进行评估bmp.wbmp.h进行初始化.因此未定义的行为.