此代码在运行时失败,而不是在编译时失败。我不是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;
}
答案 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
分配新实例。否则,您正在访问您不知道它是什么的内存。那是未定义的行为,所以任何事情都可能发生。