簡體   English   中英

結構字段默認初始化的行為

[英]Behaviors of default initialization on struct fields

這樣編寫代碼時:

#include <iostream>

using namespace std;

struct ID {
    char *name;
    int age;
};

int main() {
    ID a;

    cout << (long)(a.name) << endl;
    cout << a.age << endl;
    // cout << (a.name == nullptr) << endl;

    return 0;
}

結果是:

0
0

但是,當這樣寫時:

#include <iostream>

using namespace std;

struct ID {
    char *name;
    int age;
};

int main() {
    ID a;

    cout << (long)(a.name) << endl;
    cout << a.age << endl;
    cout << (a.name == nullptr) << endl;

    return 0;
}

結果似乎很奇怪:

140735032148552
1545300144
0

這兩個版本的差異如何?

由於行為不確定 定義局部變量不會初始化它,結構的內容將是不確定的,並且使用它會導致所述UB。

我自己找到了答案。 謝謝! 皮爾博格,丹尼爾和帕斯坦尼斯。 您的回答和評論對我有很大幫助。

我的困惑來自“ C ++ Primer”中的一段。 萬一其他人有同樣的困惑,我在這里寫下我的理解。

原始字詞:

在新標准下,我們可以為數據成員提供類內初始化程序。 創建對象時,將使用類內的初始化程序來初始化數據成員。 沒有初始化程序的成員將被默認初始化(第2.2.1節,第43頁)。 因此,當我們定義Sales_data對象時,units_sold和Revenue將被初始化為0,而bookNo將被初始化為空字符串。

-“ C ++ Primer 5th Edition”

我以為結構中的字段遵循與全局變量相同的默認初始化規則(即,初始化為它們的零值)。 但實際上,它遵循與局部變量相同的規則,即:

  1. 所有原始的內置類型均未初始化,因此它們原來是內存中的隨機值。
  2. 類類型使用其默認構造函數進行初始化。 如果沒有默認的構造函數,則無法創建包含類類型的結構(需要適當的參數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM