2013-02-08 2 views
0

뭔가 작을 것이라고 확신하지만 초기화되기 전에 계속 사용하는 방법에 대한 초기화 오류가 계속 발생합니다.문제 동적 정수 배열 만들기

#include <iostream> 
using namespace std; 
int main() 
{ 
    int* ordered; 

    ordered[0] = 5; 
    cout << ordered[0]; 
    return 0; 
} 

보너스 질문, 나는 *ordered++를 사용하여 배열을 통해 시작 주소와 루프에 액세스 할 수 *ordered를 사용할 수 있습니까?

+0

어디서나 동적 정수 배열을 만들지 않았습니다. 만든 모든 것은'int'에 대한 포인터입니다. – juanchopanza

답변

5
int* ordered; 
ordered[0] = 5; 

ordered은 초기화되지 않은 포인터입니다. 임의의 주소를 가리 킵니다. 이러한 포인터를 삭제하면 결과는 입니다. 정의되지 않은 동작이며 프로그램을 중단시킬 가능성이 큽니다.
이 포인터를 사용하여 의미있는 작업을 수행하려면 유효한 메모리 영역을 가리켜 야합니다.

int *ordered = new[x]; 

이제 충분히 큰 메모리 영역에 ordered 포인트 x 정수를 개최 :와, 그래서 당신은 할 수 있습니다. 그러나, 당신은 사용 후 메모리 할당을 해제 기억해야한다 :

delete []ordered;  

는 C++에서 수동 메모리 관리에 당신이이 없기 때문에 대신에 동적으로 할당 된 배열의 std::vector을 개시 훨씬 더 나은 그 new []을 사용합니다. 간단히 말해서, std::vector으로 잘못 처리하는 것은 어렵습니다.

+0

문자 배열이 다른 이유는 무엇입니까? –

+0

@Howdy_McGee : 그들은하지 않습니다. 포인터가 유효한 객체를 가리키는 경우에만 포인터를 역 참조 할 수 있습니다. 당신이 얻지 못하는 것은 정의되지 않은 행동입니다. 그리고 UB는 프로그램이 어떤 행동을 보여줄 수 있지만 그 행동은 보장되지 않는다는 것을 의미합니다. 따라서 프로그램이 때때로 작동 할 수는 있지만 항상 그렇게하는 것은 보장되지 않습니다. –

+0

나는 당신이 의미하는 바를 이해할 수 있는지 확신 할 수 없다. 그러나'char * asdf = "asdf"를 사용하면 안다.'asdf [0]'= a를 사용하여 각 문자에 접근 할 수있다. –

4

ordered과 관련된 메모리가 없습니다. 당신은 몇 가지 옵션이 있습니다

  • new[]
  • 사용을 사용 ordered에 일부 메모리 할당을 std::vector<int> 대신

당신은이 vector 바로 시작 부분에 메모리를 할당하거나 push_back을 사용할 수 있습니다 사용하는 경우 방법으로 필요에 따라 자랄 수 있습니다.

+0

문자 배열과 같은 다른 데이터 유형 배열을 선언 할 수 있습니까? –

+0

@Howdy_McGee 당신이 그것을 사용하지 않고 명확하고 방어할만한 이유가 없다면'vector'를 선호 할 수 있습니다. – cnicutar

+0

는 벡터를 사용할 수 없습니다. 코스를 치기 때문에 허용되지 않습니다 :/ –