2012-10-02 8 views
2

다음 코드 조각이 있습니다.이 코드는 배열 크기 조정 함수의 구현입니다. 올바른 것 같다,하지만 난 다음과 같은 오류를 얻을 프로그램을 컴파일 할 때 :int 포인터로 인해 오류가 발생합니다.

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; 
} 

이 사람이 나를 도울 수 :

여기
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. 

코드인가? 미리 감사드립니다.

+0

이어야한다. void resize (int * & arr' here '& ' –

+2

@IonutHulub - 포인터 인수가 가리키는 배열의 크기를 변경하는 함수의 목적을 무효화 할 것입니다. –

+0

'* & arr' 같은 것이 없습니다. 당신은 그것이라고 생각합니까? arr은 포인터이므로 호출 할 수는 없습니다. 그리고 가능하다해도 참조를 위해 하나의 원인을 취소하고 참조를 위해 하나를 사용하십시오. –

답변

8

, 당신은 당신이 resize에 전달해야 할 것입니다 무엇을 일반 배열이 아닌 int*,

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

을 선언합니다.

그리고, 즉, resize의 구현을 위해 기술적으로 필요한 것은 아니지만부터 당신이 결코 delete[]가 어떤 할당 된 메모리 - 당신이 해결해야 할 공간 누출 - 당신이 new -allocated 메모리 블록을 가리켜 야 resize에 전달 포인터 (delete[]resize이어야 함).

+0

정적 배열의 크기를 조정할 수 없으므로 문제를 식별했지만 올바른 조언이 아닙니다. –

+0

마찬가지로,'int *'를'resize'에 넘겨 주면 누설 - 작동하지만,'resize'는 다른 위치를 가리키게됩니다 (이전 블록에 대한 마지막 참조를 잃을 수도 있습니다). –

+0

고맙습니다. 그것은 많은 것들을 설명합니다. –

7

arr은 스택에 할당 된 배열입니다. 크기를 변경할 수 없습니다. 크기 조정 가능한 배열이 필요한 경우 포인터를 사용하고 new 배열을 할당하십시오. main에서

1

배열은 이 아니고 포인터입니다. 특히 배열은 그대로 유지됩니다. 당신은 그것을 이동할 수 없습니다. 컨텍스트에서는 poibters를 사용하여 메모리 누출과 바인딩되지 않은 액세스를 만들 수도 있습니다.

크기 조정 가능한 배열을 만들려면 배열의 요소 복사본에서 처음 설정되는 포인터를 유지해야합니다. 개인적으로 나는 std::vector<int> (내 자신의 표준 C++ 라이브러리에서 작동하고 std::vector<T>을 구현하지 않는 이상)을 귀찮게 사용하지 않을 것입니다.

0

구체적인 오류가 발생하는 이유는 arr이 (가) int*으로 일시적으로 감소한다는 것입니다. 그런 다음 비 const 참조 (매개 변수)를 임시로 바인딩하려고 시도합니다. 이는 불법입니다. 여기를 참조하십시오 : 당신이 int&을 말할 때

How come a non-const reference cannot bind to a temporary object?

0

은 당신이 int*&을 말할 때, 그 값을 변경할 수있는 int 변수 유사하게, 그것이 내가 그 값을 변경할 수있는 int* 변수를 의미 있다는 것을 의미한다. 이제 코드를 보면 arr의 값을 변경할 수 있습니다. arr = new int[10]라고 합법적입니까? 당신은 그것이 합법적이지 않다는 것을 안다. C++ 용어에서는 Lvalue이 아니다 (등호 연산자의 왼쪽에 앉을 수 없다). 그리고 비 const 레퍼런스는 모두 Lvalue

+1

'arr'과'new int [10]'모두 등호 연산자의 오른쪽에 올 수 있으며 모든 변경 가능한 참조는 _lvalues_이어야합니다. –

+0

@MooingDuck 귀하의 의견에 감사드립니다, 그것은 단순한 실수였습니다! 나는 또한 lvalue를 의미합니다. 다시 한 번 감사드립니다. – BigBoss

관련 문제