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字段已经初始化了吗?
运用
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.w并bmp.h进行初始化.因此未定义的行为.