首页 > 解决方案 > 扩展的初始化列表和未初始化的成员

问题描述

过去的结构是这样的:

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 的保证?

标签: c++

解决方案


typedef struct A {
    int m_i;
    int m_j;
} A;

是一个聚合体。当您使用花括号初始化列表初始化聚合时,它使用列表中的每个元素来初始化聚合的每个成员。如果您没有在花括号初始化列表中提供足够的元素,则保证每个后续成员都被初始化值,这对于基本类型意味着它们被零初始化。


推荐阅读