2012-10-03 3 views
-4

저는 C++ 프로그램을 작성했습니다. 실제로는 게임입니다.힙 손상에 대한 오류

Windows has triggered a breakpoint in bla bla...

누군가가 나를 도울 수 : 이 오류를받은?

void r_motions(char **map,int size) 
{ 
    int parameter_i,parameter_j,player_i,player_j; 
    int *r_location_i = new int[1],*r_location_j = new int[1]; 
    player_finder(map,size,player_i,player_j); 
    int r_num = robots_finder(map,size,r_location_i,r_location_j); 
    for(int i=1;i<=r_num;i++) 
    { 
     parameter_i =0; 
     parameter_j =0; 
     if(r_location_i[i]>player_i) parameter_i = -1; 
     if(r_location_i[i]<player_i) parameter_i = 1; 
     if(r_location_j[i]>player_j) parameter_j = -1; 
     if(r_location_j[i]<player_j) parameter_j = 1; 
     map[r_location_i[i]][r_location_j[i]] = '.'; 
     r_location_i[i] = r_location_i[i]+parameter_i; 
     r_location_j[i] = r_location_j[i]+parameter_j; 
    } 
    for(int i=1;i<=r_num;i++) 
    { 
     switch (map[r_location_i[i]][r_location_j[i]]) 
     { 
     case '.': 
      map[r_location_i[i]][r_location_j[i]] = '+'; 
      break; 
     case '@': 
      map[r_location_i[i]][r_location_j[i]] = '+'; 
      print_map(map,size); 
      cout << "Robots win ." << endl; 
      sleep(1000); 
      exit(1); 
      break; 
     case '+': 
      map[r_location_i[i]][r_location_j[i]] = '*'; 
      break; 
     case '*': 
      map[r_location_i[i]][r_location_j[i]] = '*'; 
      break; 
     default: cout << "what r u doin' ??"; 
      break; 
     } 
    } 
} 
+0

전체 오류를 표시하거나 실제로 발생한 행을 알려주지 않고 어떤 기능이 문제를 일으키는 지 파악하기 위해 코드를 단순화하지 않았습니까? – Useless

+0

'map'이 유효한 배열을 가리키고 있습니까? 한눈에 포인터로 무서운 일을하고 있다고 말하고 안전을 위해 클래스에 포장하거나 STL 컨테이너를 사용해야합니다. – Beta

답변

3

좋아, 단지 우선, 이것 좀 봐 :

int *r_location_i = new int[1], ...; 
... 
for(int i=1;i<=r_num;i++) 
    { 
    parameter_i =0; 
    ... 
    if(r_location_i[i]>player_i) parameter_i = -1; // reading outside the array 
    ... 
    r_location_i[i] = r_location_i[i]+parameter_i; // writing outside the array 
    ... 
    } 

다시 가서 공부 배열 코드,하지만 오류가 라인 AAA에서 발생
. 위의 코드에 무엇이 잘못되었는지 정확히 알 때까지 다른 포인터을 만지지 마십시오.