2013-11-25 3 views
1

이 프로그램이 충돌하고 배열 내용 및 포인터 이동과 관련하여 불법적 인 작업을 찾을 수 없습니다. 뭐가 잘못 되었 니?배열의 포인터 이동

#include <iostream> 
#include <stdint.h> 
using namespace std; 


int main(int argc, char ** argv) { 


    int * p = new int [20]; 
    for(int i=0 ; i<20 ;i++) 
     { 
      p[i]=i; 
     } 

    for(int i=0 ; i<20 ;i++) 
     { 
      printf("%d ",*p); 
      p++; 
     } 


    delete [] p; 

    return 0; 
} 
+1

질문 : 왜 처음에 '새'를 사용하고 있습니까? 'p' 배열을'main'에 로컬로 배열 /'std :: vector' /'std :: array'를 만들면 얻게 될 결과를 얻기 위해 많은 추가적인 회전을 할 것입니다. 'new' /'delete'를 충돌로부터 보호하는 방법에 대한 조언을 많이 받았지만, 처음부터 사용하지 말아야한다고 지적한 사람은 없습니다 (그리고'new'와 같은 기능이 필요할 때조차도). 'new'를 직접 쓰는 대신에'make_shared'와'make_unique'를 봐야합니다). –

+0

@JerryCoffin이 대답 해주었습니다. 대개 C++ 책, 리소스, 코스 (심지어 대학의 것들)의 대부분이 C로 링크 된 목록을 구현 한 다음 C++ 컴파일러로 컴파일하는 방법을 선호하기 때문입니다. 사람들은 여전히 ​​다른 사람들에게 "C 게토"(Bartosz Milewski가 이름을 지은 것처럼)를 편안하게 느끼는 법을 가르치고 있습니다. –

답변

6

당신은 당신의 p 포인터를 변경하고, 다음 원래 할당 된 메모리 후 메모리를 삭제하려는 : 일부 임시 반복자 포인터

delete [] p; 

저장 원래 포인터를 증가 원래 하나가 아닙니다 :

int *t = p; 
    for(int i=0 ; i<20 ;i++) 
    { 
     printf("%d ",*t); 
     t++; 
    } 
2

메모리 블록 다음의 요소를 가리키는 포인터를 삭제하고 있습니다.

2

배열의 시작 포인터를 다른 포인터에 저장하고 끝에있는 해당 포인터를 삭제하십시오.