代码之家  ›  专栏  ›  技术社区  ›  Grzegorz

扩展初始值设定项列表和未初始化成员

c++
  •  0
  • Grzegorz  · 技术社区  · 7 年前

    在过去,结构是这样的:

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

    1 回复  |  直到 7 年前
        1
  •  4
  •   NathanOliver    7 年前
    typedef struct A {
        int m_i;
        int m_j;
    } A;
    

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