2016-09-10 5 views
0

그래서 연결된 목록의 2 차원 배열로 구성된 해시 테이블이 있습니다. 나는 각 링크 된 목록의 내용을 둘러싸고있는 8 개의 셀과 비교하려고하는 비교 함수를 가지고있다. 두 개의 루프를 만들고 정수를 사용하여 두 번째 정수 배열에 사용할 논리를 사용하려고했습니다. 그러나 이것을 테스트 한 후에 나는이 잘못된 것에 대해 알고 있다는 것을 안다. 이것은 단지 예제 코드 일 뿐이고 그리드 위치를 수정할 수없는 이유를 알아 내려고하고있다. temp2 segfaults.2D 해시 테이블의 데이터에 적절하게 인덱스

Node* temp; 
Node* temp2; 
//grid is a filled 2d array of linked lists 
for(int j=0; j<b; j++) 
{ 
    for(int i=0; i<b; i++) 
    { 
     //This works for ex printing out the entire grid 
     temp = grid[j][i]; 
     while(temp != NULL) 
     { 

      cout << temp->xval; 
      temp = temp->next; 
     } 
     //However this is not allowed 
     temp2 = grid[j+1][i] 
     while(temp2 != NULL) 
     { 
      cout << temp2->xval; 
      temp2 = temp2->next; 
     }  
    } 
} 
+0

'j = b-1' 인 경우,'grid [j + 1] [i]'는 테이블의 범위를 벗어날 가능성이 있습니다. – Franck

+0

이것은 내가 프랭크에게 고맙게 생각한 것입니다. 조건을 추가하는 것이 가장 우아한 해결책이라고 생각하십니까? – Riossm

+0

간단한 2 차원 정수 배열과의 차이점을 이해하지 못합니다. 거기도 경계선에서 특별한 조건의 문제가 있습니다. 맞습니까? – user4407569

답변

0

당신은 아마 당신이 할 때 존재하지 않는 '셀'에 액세스하려고 :

temp2 = grid[j+1][i] 
    while(temp2 != NULL) 
    { 
     cout << temp2->xval; 
     temp2 = temp2->next; 
    } 

당신이하고있는 모든 temp2에서 메모리가 null 아님을 확인하지만이를 널 (null)이거나 배열의 일부이거나 프로그램에 할당되었다고 보장 할 수 없습니다.

가장 쉬운 방법은 ji이 항상 b보다 작은 지 확인하는 것입니다.

는 편집 :

정수 배열을 사용하는 경우이 건너하지 않은 이유는 단지 운이다.

정수 배열의 경우 배열 끝을 넘어서 읽는 중이지만 정수로 찾는 바이트는 모두 해석합니다. 대부분의 경우 프로그램에서 다른 임의의 변수를 읽으므로 오류가 발생하지 않습니다.

링크 된 목록을 사용하면 포인터가 들어있는 셀로 인식되는 것을 해석 할 수 있습니다. 그런 다음이 횡설수설하는 포인터를 참조 해제합니다. 즉, 배열의 '직후'이지만 잠재적으로 어딘가의 '멀리있는'메모리에 더 이상 액세스하지 않음을 의미합니다. 이렇게하면 segfault가 발생할 확률이 높아집니다.