c ++代码的行为取决于编译器

问题描述 投票:0回答:1

我真的是C和C ++的新手

我试图尝试使用结构来创建一个基本上可以包含float和list的类似列表的结构。

此代码可以编译,但是其行为取决于编译器:

  • 使用Visual Studio社区的最新版本,它先输出5,然后输出0

  • 带有online shell,我得到5,然后是5

我想获得的是向量通过函数传递时的第二个。

这里是代码:

#include <iostream>
#include <vector>

using namespace std;

struct Box {
    Box(char t) {
        type = t;
    }
    union Value {
        float number;
        vector<Box>* elements;
    };
    Value value;
    char type;
};

Box newBox() {
    Box aBox('l');

    vector<Box> newVec;
    newVec.assign(5, Box('n'));


    aBox.value.elements = &newVec;
    cout << aBox.value.elements->size() << "\n";
    return aBox;

}

int main()
{
    Box test = newBox();
    cout << test.value.elements->size();  // this is not always working nicely
}


那是哪里来的?

我的代码有问题吗?

还有没有更好的方法来创建这种结构?

c++ pointers struct compiler-construction
1个回答
0
投票

在此行:

aBox.value.elements = &newVec;

您正在存储局部变量的地址。当您从newBox函数返回时,该变量死亡,然后通过指针访问该内存将调用未定义的行为。

© www.soinside.com 2019 - 2024. All rights reserved.