在过去的结构中,
typedef struct A {
int m_i;
int m_j;
} A;
在堆上分配或在函数中本地声明而不被memset
对其成员进行初始化。
但是,令我惊讶的是,这个小程序显示它始终设置为0。
#include <stdio.h>
typedef struct A {
int m_i;
int m_j;
} A;
void f(const A& a) {
printf("i=%i, j=%i\n", a.m_i, a.m_j);
}
void y() {
f({10});
}
int main() {
y();
return 0;
}
使用g++ -std=c++11 a.cpp
我只是以防万一定义了一个构造函数以确保它们为零,但是我的各种测试表明(使用在Internet上找到的代码)我不必这样做。
这是剪切巧合还是扩展的初始值设定项列表可以保证内存是内存集?
答案 0 :(得分:4)
typedef struct A {
int m_i;
int m_j;
} A;
是一个聚合。当您使用 braced-init-list 初始化聚合时,它将使用列表中的每个元素来初始化聚合的每个成员。如果您在 braced-init-list 中没有提供足够的元素,则可以保证每个后续成员都将被值初始化,这对于基本类型意味着它们被初始化为零。