2013-10-15 9 views
2

구조체에 대한 포인터 배열을 이해하는 데 문제가 있습니다. 나는이 간단한 예제를 만들어 더 잘 이해하려고 노력했다. 그것이 컴파일 되긴하지만, 나는 아래에 보이는 지점에서 "BAD ACCESS"충돌 (넌센스 포인터)을 계속합니다. 왜 이것이 잘못된지 설명 할 수 있습니까?구조체에 대한 포인터 배열 만들기 - C++

#include <iostream> 
using namespace std; 

struct complex_num { 
    double real_part; 
    double imag_part; 
}; 

void init_complex(complex_num *element) { 
    element->real_part = -1.0;    // <--- EXECUTION STOPS HERE. 
    element->imag_part = 1.0; 
} 

int main(int argc, char *argv[]) { 
    int n = 5; 

    complex_num *array[n]; // Allocates for an array of n pointers to 
          // the complex_num structure, correct? 

    for (int i = 0; i < n; i++) { 
     init_complex(array[i]); 
    } 

    return 0; 
} 

나는 더 나은 방법이 있습니다. 나는이 스타일이 매우 C라는 것을 알고있다. 다른 데이터 구조를 제안하지 마십시오. 나는 구체적으로 구조에 대한 포인터의 배열에 대해 궁금 해서요. 감사!

답변

4

complex_num 개체에 대한 포인터를 가진 배열에 대해서만 메모리를 할당하지 않았습니다. 따라서 init_complex를 호출하면 잘못된 위치에 대한 포인터에서 작동합니다.

이 시도 :

for (int i = 0; i < n; i++) { 
    array[i] = new complex_num(); 
    init_complex(array[i]); 
} 

명세서 complex_num *array[n]는 complex_num하는 n 개의 포인터의 배열을 만듭니다. 의미는 배열이 보유 할 수 있습니다 n포인터 to complex_num; 하지만 포인터 자체는 아직 초기화되지 않았습니다. 그들은 임의의 위치를 ​​가리 킵니다 - C++에서 초기화되지 않은 모든 기본 요소 (포인터가 속한 곳)는 대개 할당 전에 메모리 위치에있는 값을 포함합니다. 초기화되지 않은 포인터가 가리키는 위치를 알려주는 방법 (또는 최소한 합리적으로 쉬운 방법)이 없기 때문에 이것은 거의 예상치 못한 결과를 가져올 것입니다.

따라서 배열 지점의 각 포인터를 적절하게 설정 한 메모리 위치 (complex_num)로 설정해야합니다. 그 후에 만 ​​포인터가 가리키는 곳의 complex_num에있는 값에 액세스 (읽기 또는 쓰기)해야합니다. 예 : 동적으로 할당 된 새 complex_num 객체를 가리키고 위 코드를 사용합니다 (동적 할당을 수행하는 new 키워드를 확인하십시오).

사이드 노트 : 위에 표시된 것처럼 동적으로 할당 된 객체를 가리키는 "원시"포인터는 처리하기 까다 롭습니다 (완료 후 delete에 전화하는 것을 잊지 말아야합니다. 그렇지 않으면 메모리가 누출 될 것입니다). 따라서 권장되는 방법 보통 스마트 포인터 (예 : C++ 11에서 소개 된 std :: shared_ptr)를 사용합니다.

1

예, 선언 한 포인터에 할당 된 메모리가 없습니다. 유효한 구조 객체를 가리 키지 않습니다.

관련 문제