2016-12-26 110 views
1

我剛剛在一個月前開始編程C語言,而且我顯然不明白關於內存分配的一些事情,即使我已經從幾個不同的來源讀到它。初學者級別的內存分配

如果有人能解釋爲什麼這個簡單的例子我犯了崩潰,我會非常感激。 (對不起英語不好)

void test(double *x) 
{ 
    x = (double *)malloc(2 * sizeof(double)); 
    x[0] = 2; 
    x[1] = 3; 
} 

int main() 
{ 
    double *x = NULL; 
    test(x); 

    printf(" %f", x[0]); //this is where it crashes with no message 
} 
+4

請刪除'C++'標籤。 *我們正在與'c' *交戰。 < - 笑話。放鬆。但嚴重的是,你應該刪除'C++'標籤。這些日子是兩種不同的語言。 – 2016-12-26 20:06:04

+0

一個調試器和兩個斷點。如果你在兩種情況下檢查存儲在'x'中的地址,'test'結尾處的一個和'main'中''printf''的一個將顯示出問題。提示:在'test'中賦值'x = ...'對調用者('main')意味着* nothing *,並且'x'保持不變。 – WhozCraig

+0

1)不要將'malloc()'2)返回的值轉換爲調用程序中指針指向新地址,指針必須作爲「指針指針」傳遞。 I.E. '測試(&x);''和函數測試需要簽名:'void test(double ** x)'注意'**'然後設置該值必須取消引用傳入的指針IE * * = malloc(2 * sizeof(double));'然後'x'是指向指針的指針(並注意C運算符的優先級)使用:'(* x)[0] = 2;' – user3629249

回答

3

你的問題不是內存分配問題。這是與C的價值參數傳遞。你的函數分配內存,但不能更新傳入的參數,因爲它只有它的值,而不是它的地址。

嘗試

void test(double **x) 
{ 
    *x = (double *)malloc(2*sizeof(double)); 
    (*x)[0] = 2; 
    (*x)[1] = 3; 
} 
int main() 
{ 
    double *x = NULL; 
    test(&x); 

    printf(" %f", x[0]); //this is where it crashes with no message 
} 
-1

我不知道到底是爲什麼指針不更新,但如果你是一個指針結構通過它的工作等方面,需要更新指針像所以。 如果您正在分配的指針的類型爲void,那麼您只需要投射數據類型。

double *test() 
    { 
     double *x = malloc(2*sizeof(double)); 
     x[0] = 2; 
     x[1] = 3; 
     return x; 
    } 

int main() 
{ 
    double *x = test(); 


    printf(" %f", x[0]); //this is where it crashes with no message 
} 
+0

函數參數,傳遞並接收? –

+0

這是唯一的方法,否則你需要傳遞一個指針指針,無論你的偏好如何。 –

+0

哦謝謝xD我只注意到我忘了設置函數參數! –