2016-02-25 148 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?它不回答這個問題,如果你構成一個不同的問題,並回答這個問題。 –