重新分配后,指向自己的结构成员的C ++指针具有不同的值

时间:2018-08-18 08:40:33

标签: c++ pointers memory struct

我正在使用Visual Studio 2017,并且遇到了一个我无法理解的错误。我以以下代码为例:

#include <iostream>

struct Foo
{
    int a = 0;
    int c;
    int *b;

    Foo(int n)
    {
        a = n;
        b = &c;
    }
};

struct Bar
{
    Foo nestedFoo = Foo(0);

    Bar(int n)
    {
        std::cout << "bar constructor nestedFoo before:" << std::endl;
        std::cout << &nestedFoo.a << std::endl;
        std::cout << nestedFoo.b << std::endl;
        nestedFoo = Foo(n);
        std::cout << "bar constructor nestedFoo after:" << std::endl;
        std::cout << &nestedFoo.a << std::endl;
        std::cout << nestedFoo.b << std::endl;
    }
};

struct App
{
    Bar bar = Bar(2);
};

int main()
{
    App app;
    Bar bar = Bar(10);
    Foo foo = Foo(5);

    std::cout << "foo before:" << std::endl;
    std::cout << &foo.a << std::endl;
    std::cout << foo.b << std::endl;

    foo = Foo(20);
    std::cout << "foo after:" << std::endl;
    std::cout << &foo.a << std::endl;
    std::cout << foo.b << std::endl;

    std::cout << "bar.nestedFoo:" << std::endl;
    std::cout << &bar.nestedFoo.a << std::endl;
    std::cout << bar.nestedFoo.b << std::endl;

    std::cout << "app.bar.nestedFoo:" << std::endl;
    std::cout << &app.bar.nestedFoo.a << std::endl;
    std::cout << app.bar.nestedFoo.b << std::endl;
    return 0;
}

我希望重新分配后成员的指针和地址相同,但是似乎并非如此,&Foo.aFoo.b具有不同的值:

bar constructor nestedFoo before: 
0058FEE8                          
0058FEE8                          
bar constructor nestedFoo after:  
0058FEE8                          
0058FC24                          
bar constructor nestedFoo before: 
0058FED8                          
0058FED8                          
bar constructor nestedFoo after:  
0058FED8                          
0058FD04                          
foo before:                       
0058FEC8                          
0058FEC8                          
foo after:                        
0058FEC8                          
0058FDF8                          
bar.nestedFoo:                    
0058FED8                          
0058FD04                          
app.bar.nestedFoo:                
0058FEE8                          
0058FC24                    

起初,我以为只有在Foo成为另一个结构的成员时才会发生这种情况,但这似乎发生在顶级工作中。那我在做什么错了?

任何帮助将不胜感激,谢谢!

编辑:显示将b分配给&c成员(该成员没有(明确)重新分配)也没有用。

0 个答案:

没有答案