2010-08-18 256 views
3

當添加(4)被調用時,我的main()崩潰。函數返回指向int的指針

據我所知int * add,它應該返回一個指向整數的指針。然後,我應該可以主要說:

int * a = add(3);

返回一個指向int的指針。

請解釋我做錯了什麼。

#include <cstdlib> 
#include <iostream> 

using namespace std; 

int* add (int a) { 
    int * c, d; 
    d = a + 1; 
    *c = d; 
    cout << "c = " << c << endl; 
    return c; 
} 

int main(int argc, char *argv[]) 
{ 
    int a = 4; 

    int * c; 

    c = add(4); 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
+0

+1 - @橡膠靴是正確的 – ChrisBD 2010-08-18 14:38:07

+4

不,他不是。閱讀理解,人。 '* c = d' does * not * make'c' point to'd'! – 2010-08-18 14:38:45

+1

比這更糟糕的是,您正在寫入並返回一個未初始化的指針。 – 2010-08-18 14:38:47

回答

5

*c = d; 

指針c沒有初始化,所以你的程序運行到未定義的行爲。你可以這樣做以下代替:

void add(int what, int* toWhat) 
{ 
    (*toWhat) += what; 
} 

,並調用它像這樣:

int initialValue = ...; 
add(4, &initialValue); 
7

的問題是,你聲明的int*,但沒有給它任何指向。你需要做的是用一個內存位置初始化(checknig省略錯誤)

int* c = new int(); 
... 
*c = d; // Now works 

後來雖然你將需要確保,因爲它是一個分配的資源來釋放此內存。

更好的解決方案是使用引用。指針有幾個令人討厭的屬性,包括單位值,NULL,需要免費等等......其中大多數不在參考文獻中。這裏是如何在這種情況下使用引用的例子。

void add (int a, int& c) { 
    int d; 
    d = a + 1; 
    c = d; 
    cout << "c = " << c << endl; 
} 

int c; 
add(4, c); 
+0

中得到一個簡單的答案在C++中,使用'malloc'幾乎肯定是錯誤的事情。 – 2010-08-18 14:41:03

+0

@Mike,同意了。只讀取問題代碼並假定它是一個C問題。更新了 – JaredPar 2010-08-18 14:42:17

+0

+1。 – Puppy 2010-08-18 14:59:05

3

您從不分配任何內存給指針c。指針必須指向有效的內存,並且您必須通過調用new來自己分配內存,例如寫

int* c = new int(); 

add函數內。現在c指向一個足夠容納int的有效內存塊。完成該內存後,請致電delete c將其解除分配並將其釋放回系統。

+0

這個問題被標記爲C++,所以使用'malloc'將是一個非常糟糕的主意。 – 2010-08-18 14:42:16

+1

好吧,不是一個壞主意(malloc在C++中完全合法),但不是最好的主意。雖然會修復。 – 2010-08-18 15:14:19

+0

你的回答非常有幫助。謝謝^ _ ^ – Mahmoud 2013-03-05 13:50:04

1

由於c是未初始化的指針,所以出現錯誤,因此它是未定義的行爲。