2014-10-23 2 views
1

내가 왜이 코드 나던 작업을 부탁드립니다 표시 ...C++ 배열을 반환하고

int* funkce(){ 
    int array[] = {1,2,3,4,5}; 
    return(array); 
    } 

int main(){ 

    int* pp = funkce(); 
    int* ppk = pp+5; 

    for (int *i = pp; i!=ppk; i++){ 
     cout << (*i) << endl; 
    } 

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

이 코드 표시 :

1 
16989655 
4651388 
- // - 
253936048 

그래서 poniter 배열 벗어 .. 하지만 Main에 배열이있는이 코드는 괜찮습니까?

int main(){ 

    int a[] = {1,2,3,4,5}; 
    int* pp = a; 
    int* ppk = pp+5; 

    for (int *i = pp; i!=ppk; i++){ 
     cout << (*i) << endl; 
    } 
    system("PAUSE"); 
    return(0); 
} 

이 코드 표시 :

1 
2 
3 
4 
5 

당신이 나에게 왜 첫 번째 나던 작품을 설명 할 수 있을까요? 감사합니다.

+0

http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – chris

답변

6

함수가 끝나면 범위를 벗어나는 임시 포인터를 반환합니다.

std::array<int, 5> func() { 
    // stack-allocated 
    std::array<int, 5> a = {1, 2, 3, 4, 5}; 
    return a; 
} 

std::vector<int> func() { 
    // heap-allocated 
    std::vector<int> a = {1, 2, 3, 4, 5}; 
    return a; 
} 

int* func() { 
    // heap-allocated, you have to remember to delete it 
    int* a = new int[5]{1, 2, 3, 4, 5}; 
    return a; 
} 

등 더 많은 옵션이있다, 그러나 이것은 당신에게 좋은 시작을 주어야한다 : 당신은 함수가 배열을 반환해야 할 경우 중 하나를 수행해야합니다.

+0

std :: vector (IMHO) – pm100

+0

@ pm100 왜 std :: array가 아닌가? –

+0

왜냐하면 std : 배열은 배열의 복사본을 반환하기 때문입니다 (일반적으로는 더 비싸지 만 일반적으로는 더 비쌉니다). std :: vector는 힙의 배열에 대한 포인터를 반환합니다. 그리고 vector와 array의 perf는 동일합니다. – pm100

0

변수에 로컬 포인터/참조를 반환하지 마십시오. 해당 메모리는 반환 될 때 해제/재사용됩니다.

해당 매달린 참조는 정의되지 않은 동작이므로 예측할 수없는 결과가 발생합니다.

개체, 힙 할당 메모리에 대한 포인터를 반환하거나 호출자가 제공 한 버퍼에 저장합니다.

관련 문제