我得到了以下代码,它可以完美地编译,但是通过执行程序,它只会崩溃并关闭。我不明白为什么。
main{
...
MLdouble *u = NULL;
_intersect(...,u,...); //u as MLdouble* type
...
}
CurvatureCalc::_intersect(... MLdouble *u)
{
...
MLdouble test = 123.21
*u = test; //<---line where it crashes
}
我做错了什么?我只是监督一些简单的事情。没有其他地方使用过你。我尝试过的是不同的变体,例如使用u =&amp; test,这显然也不起作用。提前致谢。
答案 0 :(得分:3)
由于您使用C ++编程,您真正应该做的是通过引用传递参数:
CurvatureCalc::_intersect(... MLdouble &u, ...) // Note use of & instead of *
{
...
u = ...; // No dereference
...
}
打电话给&#34;正常&#34;
MLdouble u; // Not a pointer
_intersect(..., u, ...);
使用指针是模拟通过引用传递的旧C方式,它不是通过传递一个指针变量,而是将指针传递给变量。像这样:
MLdouble u; // Not a pointer
_intersect(..., &u, ...); // Note use of address-of operator & here
您现在正在做的是取消引用空指针,并且不允许这样做。
答案 1 :(得分:2)
我得到了以下代码,完美编译
它编译因为它在语法上是正确的。语法正确并不意味着程序完全正确。
但是通过执行程序,它就会崩溃
您的代码中存在未定义的行为。
我做错了什么?
您将指针初始化为null:
MLdouble *u = NULL;
将空指针传递给函数:
_intersect(...,u,...); //u as MLdouble* type
取消引用空指针:
*u = test; //<---line where it crashes
取消引用空指针(或任何未指向有效对象的指针)具有未定义的行为。
解决方案是使用指向有效对象的指针。或者,如果您可以修改_intersect
,则将参数更改为参考,以便您不会意外传递空值。
答案 2 :(得分:-2)
首先提供更多代码;
MLdouble *u = NULL; // u is nullptr,
*u = test; /* you pass pointer which doesnt point to any address yet
and write - unexpected behavior, even if you pass address of local variable to u aka u = &test
test will get destroyed when,
and you pointer will point to "garbage"*/
所以你必须使用new运算符然后删除它或使用智能指针
MLdouble *u = new MLdouble(...);/// or auto u = new MLdouble(...);
delete u;
u = nullptr;