指针麻烦C ++

时间:2016-02-25 10:14:12

标签: c++ pointers crash

我得到了以下代码,它可以完美地编译,但是通过执行程序,它只会崩溃并关闭。我不明白为什么。

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,这显然也不起作用。提前致谢。

3 个答案:

答案 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;