2016-02-25 102 views
-2

我得到了下面的代码,它完美地编译,但通过执行程序,它只是崩溃并关闭。我不知道为什么。指针故障C++

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

+3

'u'是一个空指针。你取消引用它。坏事发生。如果您取消引用空指针,您希望发生什么? –

+1

此外,_“编译完美,但通过执行该程序,它只是崩溃并关闭”_,是的,欢迎来到计算机编程。让代码正常工作是你的工作,只需要编译代码是不够的。 –

回答

3

既然你用C++编程,你真正应该做的是参考来传递参数

CurvatureCalc::_intersect(... MLdouble &u, ...) // Note use of & instead of * 
{ 
    ... 
    u = ...; // No dereference 
    ... 
} 

并调用 “正常”

MLdouble u; // Not a pointer 
_intersect(..., u, ...); 

使用指针是的旧C路,它仿效通过引用传递,它不通过传递一个变量作为指针,b ut将一个指针传递给这个变量。像这样:

MLdouble u; // Not a pointer 
_intersect(..., &u, ...); // Note use of address-of operator & here 

你现在正在做的是取消引用空指针,这是不允许的。

+0

解决了我的问题。非常感谢。 – Muleque

2

我得到了下面的代码,它编译完美

它编译,因为它的语法正确。在语法上正确并不意味着该程序完全是正确

,但通过执行程序,它只是crashs

你已经在你的代码未定义的行为。

我在做什么错?

您初始化一个指向空:

MLdouble *u = NULL; 

你通过空指针的函数:

_intersect(...,u,...); //u as MLdouble* type 

取消引用空指针:

*u = test; //<---line where it crashes 

提领一个空指针(或任何不指向的指针)到一个有效的对象)有未定义的行为。

解决方法是使用指向有效对象的指针。或者,如果您可以修改_intersect,则将该参数更改为引用,以便您不会意外传递空值。

-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"*/ 

,所以你必须使用新的运营商然后将其删除,或者使用智能指针

MLdouble *u = new MLdouble(...);/// or auto u = new MLdouble(...); 
delete u; 
u = nullptr; 
+0

_“p会在_时被破坏?什么是p?它不回答这个问题,如果你构成一个不同的问题,并回答这个问题。 –