c++ - 扩展的初始化列表和未初始化的成员
问题描述
过去的结构是这样的:
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
我会以防万一定义一个构造函数以确保它们为零,但我的各种测试显示(使用在互联网上找到的代码)我不必这样做。
这是剪切巧合还是扩展初始化列表是内存被 memset 的保证?
解决方案
typedef struct A {
int m_i;
int m_j;
} A;
是一个聚合体。当您使用花括号初始化列表初始化聚合时,它使用列表中的每个元素来初始化聚合的每个成员。如果您没有在花括号初始化列表中提供足够的元素,则保证每个后续成员都被初始化值,这对于基本类型意味着它们被零初始化。
推荐阅读
- reactjs - 如何将 CSS 与组件捆绑为 npm 包?
- python - 使用 str.format() 和字典
- yosys - 在 foreach 循环中通过 chparam 更改参数后未找到子模块
- python - django.template.exceptions.TemplateDoesNotExist: home.html
- mysql - HikariCP 尝试使用与提供的用户 ID 不同的池连接
- android - 我在反应原生时出错 null is not an object ''evalating _ReanimatedModule.default.configureProps'
- java - Wildfly 上的部署因 java.lang.NoSuchMethodError 而失败
- python - 在python中将文本文件转换为.xlsx
- java - 什么是从简单 Java 对象(POJO)的 getter 到 setter 映射的好方法。可以使用反射吗?
- angular - 网页不可用 - com.googlecontent.apps... 的网页无法加载,因为 ERR_UNKNOWN_URL_SCHEME