我一直试图让这段代码工作一段时间,不幸的是,我总是得到NullReferenceException
。我发现如果没有使用指向类的指针,这段代码可以工作,但我不明白为什么指针会导致这个异常。顺便说一句,我对c ++不是很有经验,所以你可以用一种简单的方式来解释它。提前谢谢。
class Box
{
public: char* data;
};
int Main()
{
Box* a;
a->data = "Hello World";
return 0;
}
答案 0 :(得分:2)
Box* a;
向Box
对象声明指针。您无法创建 Box
个对象,因此a
并不指向任何内容。
因此,编写a->data
的行为未定义。
删除指针以获得Box a;
,或使用Box* a = new Box();
。在后一种情况下,不要忘记在某个时候打电话给delete a;
,否则你会泄漏内存。
最后,编写a->data = "Hello World";
可能会有问题:a->data
将成为指向只读字符串文字的指针;尝试修改该缓冲区内容的行为是 undefined 。
使用std::string
作为a
的类型会好得多。
答案 1 :(得分:1)
Box
对象的指针是而不是 Box
个对象。指针Box* a
指向一个不存在的对象,这就是当你尝试分配" Hello World"时出现错误的原因。成员。
你应该通过在堆栈上创建一个Box
对象"" 自动存储持续时间:
Box a;
或在堆上创建#34;" 动态存储持续时间:
Box* a = new Box;
并在使用后将其删除:
delete a;
答案 2 :(得分:1)
指针只指向(希望)已分配的内存块。在您的示例中,指针未初始化,因此您尝试设置您无权访问的内存。
你应该确保它指向有效的东西,如:
int Main()
{
Box box; // stack allocation
Box* a = &box; // you could also call new Box; here
a->data = "Hello World";
return 0;
}
答案 3 :(得分:1)
a
的值未定义,因为您从未将其设置为任何内容。因此,一切都可能发生。最可能的是您访问不属于您的内存,触发分段错误或类似的访问异常。这就是发生的事。
不要这样做。根据已定义的相同类型的变量的地址定义您的地址。
答案 4 :(得分:0)
a
未初始化(或已分配),它只是一个悬垂的指针。对它的任何解除引用都是Undefined behavior。
您可以Box* a = new Box
或Box b; Box* a = &b
使指针有效。 e.g。
Box* a = new Box;
a->data = "Hello World";
...
delete a;