C ++匿名结构调用失败

时间:2011-11-28 19:23:32

标签: c++ struct anonymous-types

此代码在运行时失败,而不是在编译时失败。我不是C ++专家。 有什么帮助吗?

extern void fn();

int main(int argc, char** argv) {
    fn();
}

void fn()
{
    struct Foo{
        string name;
    }*foo;
    foo->name="sleiman";
    cout<<foo->name<<endl;
}

为什么此代码在运行时失败,为什么在创建静态实例时会成功?

void fn()
{
    struct Foo{
        string name;
    }foo;
    foo.name="sleiman";
    cout<<foo.name<<endl;
}

4 个答案:

答案 0 :(得分:7)

foo是一个指针但未初始化,因此当您尝试访问名称时,它正在读取无效内存。您将foo初始化为指向Foo结构的指针,但不要指示它指向实际对象,因此实际上是一个松散的指针。

为了完成这项工作,您需要使用new关键字或其他方法使指针指向实际对象。

答案 1 :(得分:2)

在你的第一个例子中,你看起来正在指向foo。仅仅因为你指向foo并不意味着它实际指向一个对象。您必须使用new来创建该对象。试试这个:

void fn()
{
    struct Foo{
        string name;
    };
    Foo* foo = new Foo;
    foo->name="sleiman";
    cout<<foo->name<<endl;
    delete foo;
}

确保在使用完毕后将其删除。

答案 2 :(得分:1)

struct Foo{
    string name;
}*foo;

foo被声明为指向Foo的指针,但它没有指向任何真实对象。您需要使用 new 创建实例,然后才能访问其成员。它更像是 -

int *ptr;
(*ptr) = 100;   // Can you do this with out ptr pointing to a valid resource ?

但在另一种情况下,你有自己的真实对象。

答案 3 :(得分:1)

当你创建一个指向X的指针时,你实际上并没有分配一个X,而你的指针指向空间中的某个地方。您需要指定指针以指向预先存在的X实例,或者使用new X分配新实例。否则,您正在访问您不知道它是什么的内存。那是未定义的行为,所以任何事情都可能发生。