2012-10-02 138 views
2

我有以下一段代碼,它是一個數組調整功能的實現。這似乎是正確的,但是當我編譯程序,我得到了以下錯誤:指向int的指針引起錯誤

g++ -Wall -o "resizing_arrays" "resizing_arrays.cpp" (in directory: /home/aristofanis/Desktop/coursera-impl) 
resizing_arrays.cpp: In function ‘int main()’: 
resizing_arrays.cpp:37: error: invalid initialization of non-const reference of type ‘int*&’ from a temporary of type ‘int*’ 
resizing_arrays.cpp:7: error: in passing argument 1 of ‘void resize(int*&, int, int, int)’ 
resizing_arrays.cpp:39: error: invalid initialization of non-const reference of type ‘int*&’ from a temporary of type ‘int*’ 
resizing_arrays.cpp:7: error: in passing argument 1 of ‘void resize(int*&, int, int, int)’ 
resizing_arrays.cpp:41: error: invalid initialization of non-const reference of type ‘int*&’ from a temporary of type ‘int*’ 
resizing_arrays.cpp:7: error: in passing argument 1 of ‘void resize(int*&, int, int, int)’ 
Compilation failed. 

下面是代碼:

int N=5; 

void resize(int *&arr, int N, int newCap, int initial=0) { // line 7 
    N = newCap; 
    int *tmp = new int[ newCap ]; 
    for(int i=0; i<N; ++i) { 
    tmp[ i ] = arr[ i ]; 
    } 
    if(newCap > N) { 
    for(int i=N; i<newCap; ++i) { 
     tmp[ i ] = initial; 
    } 
    } 

    arr = new int[ newCap ]; 

    for(int i=0; i<newCap; ++i) { 
    arr[ i ] = tmp[ i ]; 
    } 
} 

void print(int *arr, int N) { 
    for(int i=0; i<N; ++i) { 
    cout << arr[ i ]; 
    if(i != N-1) cout << " "; 
    } 
} 

int main() { 
    int arr[] = { 1, 2, 3, 4, 5 }; 

    print(arr, N); 
    resize(arr, N, 5, 6); // line 37 
    print(arr, N); 
    resize(arr, N, 10, 1); // line 39 
    print(arr, N); 
    resize(arr, N, 3); // line 41 
    print (arr, N); 

    return 0; 
} 

誰能幫助我?提前致謝。

+0

'void resize(int *&arr' here remove '&' –

+2

@IonutHulub - 這會破壞函數的目的,即改變指針參數指向的數組大小。 –

+0

沒有'*&arr'這樣的東西。你認爲這是一個指針,所以你不能打電話給它,即使你可以,撤銷&的效果,一個是供參考,另一個如果是取消引用。 –

回答

8

main,你聲明

int arr[] = { 1, 2, 3, 4, 5 }; 

一個普通的數組,不是int*,這是你必須傳遞給resize什麼。

而且,雖然這是不是你的落實resize技術上必要的,因爲你永遠不delete[]任何分配的內存存在 - 一個空間泄漏你應該修改 - ,你傳遞給resize應指向new -allocated內存塊的指針(你應該delete[]resize)。

+0

不可能調整靜態數組的大小,所以這不是一個正確的建議,儘管你確實發現了這個問題。 –

+0

因爲將任何'int *'傳遞給'resize'將會泄漏,但是'resize'會使它指向一個不同的位置(丟失可能是最後一個引用的舊塊)。 –

+0

非常感謝。這解釋了很多事情。 –

7

arr是在堆棧上分配的數組。你不能改變它的大小。如果您需要可調整大小的數組,請使用指針並使用new分配數組。

1

數組是而不是的指針。特別是數組保持不變。你不能移動它。在上下文中,您使用的是poibters,您也會創建內存泄漏和無限制的訪問。

要創建一個可調整大小的數組,您需要維護一個指針,該指針最初從您數組中的元素副本中設置。就個人而言,我不會打擾並使用std::vector<int>(除非我正在使用我自己的標準C++庫並實現std::vector<T>)。

0

當你說int&這意味着int變量,我可以改變它的價值,同樣,當你說int*&,這意味着int*變量,我可以改變它的值。現在看看你的代碼,你可以更改arr的值。說arr = new int[10]是合法的嗎?你看它是不合法的,在C++術語中它不是一個Lvalue(它不能坐在等號運算符的左側),並且所有非const引用必須是Lvalue

+1

'arr'和'new int [10]'可以在等號運算符的右側,並且所有可變引用都必須是_lvalues_。 –

+0

@MooingDuck感謝您的評論,這是一個簡單的錯誤!我的意思是左值。再次感謝 – BigBoss