2017-05-27 61 views
0

我試圖從我的用戶得到的數字,這是我的職責,打印動態數組

我的功能得到改編爲指針,將其設置爲一個新的數組並返回,我得到的數量的計數器打印。

,但是當我嘗試打印數組我得到一個錯誤療法被提

int GetNumber(int *arr) 
{ 
    int n,i=0; 
    int *temp; 
    temp = (int*)calloc(1,sizeof(int)); 
    assert(temp); 
    scanf("%d",&n); 
    while(n != -1) 
    { 
     i++; 
     temp = (int*) realloc(temp,i*sizeof(int)); 
     assert(temp); 
     temp[i-1] = n; 
     scanf("%d",&n); 
    } 
    arr = temp; 
    return i; 
} 
+1

您只修改當前堆棧幀上的指針地址,而不是調用的地址。你應該使用'int ** arr'作爲參數並且使用'* arr = realloc(* arr,...)'來重新分配,並且因此將一個指針傳遞給一個int指針,如下所示:'GetNumber(&the_arr)' – Cheatah

+0

而不是'realloc'並將返回值分配給您的原始變量。如果'realloc'失敗,原始的'temp'不會被釋放,並且'NULL'被返回並分配給'temp',導致您失去對'temp'所指向的內存塊的引用,從而產生內存泄漏。而是使用臨時指針,例如'void * t = realloc(temp,i * sizeof * temp);如果(t)temp = t;' –

回答

2

的問題是,您修改局部變量。

在C中,所有參數都是「按值」傳遞的,這意味着該值被複制到函數的作用域中。這也會發生在您的指針arr。如果您在該功能中修改arr,這絕不會影響呼叫者。

的解決方案是將指針傳遞給要修改什麼,所以你的簽名應該是這樣的:

int GetNumber(int **arr) 

的是,這個指針是按值傳遞,但它指向你想要的其他指針修改。

請注意,不要在C中轉換void *。它可以隱式轉換爲任何指針類型。

+0

這裏有一個'malloc'類型的方便鏈接(你會發現你需要重複它),[**我是否將malloc的結果? (http://stackoverflow.com/q/605845/995714) –