2012-03-26 3 views
1

나는 이진 행렬을 연구 중이다. 내 배열 중 두 개가 겹쳐져 있습니다. (나는 주소를 확인했다.) 이것은 단지 몇 가지 크기의 행렬에 대해서만 발생한다. 그러므로 나는 잘못된 결과를 얻는다. 내가 배열을 할당하는 새로운 사용했지만, 내가 할 때 세분화 오류가 발생합니다. 메모리 겹침을 피할 수있는 방법이 있습니까? g ++ 컴파일러를 사용하고 있습니다. 두 배열의 메모리 주소 중복

내가 그들 모두를 초기화 다음 단계에서 배열을
bool A[size0][size0],B[size0][size0],C[size0][size0]; 

을 선언하는 방법입니다. A와 B는 피연산자이고 C는 결과를 보유합니다.

다음 단계에서 맞춤 곱셈 알고리즘을 사용하고 있습니다. 여기에 중복되는 조각

for(I=0;I<cnm;I++){ 
    bool Tab[m][size]; 
    bool Ctemp[size][size]; 

    int count=0; 
    for(uint i=0;i<pow(2.0,m*1.0);i++){ 
      for(uint j=0;j<n;j++){ 
        Tab[i][j]=0; //Initialize 
        if(i==0){ 
          Tab[i][j] = 0; 
        } 
        else{ 
         int dec; 
         //h is calculated here 
         dec=gray_map[i-1]^gray_map[i]; //gray_map returns gray code 
         Tab[i][j] = Tab[i-1][j]^B[h][j]; 
        } 
        .... 
        .... 
       } 
    } 
    ..... 
    ..... 
    //Rest of the code 
내 관찰 Tab 당으로

C입니다. 인쇄하여 메모리 주소를 확인했습니다. 루프에 대한 두 번째 레벨의 여섯 번째 반복에서 중복됩니다 (n = 9, m = 3, 크기 = 9, cnm = 3). 그 사이에 C을 사용하지 않았습니다. 외부 루프에서만 사용합니다.

+6

몇 가지 코드를 보여주십시오. 메모리 겹침이 발생해서는 안됩니다. –

+0

@LuchianGrigore 스 니펫을 추가했습니다. – nouveau

답변

5

C- 컴플라이언스는 중복 배열을 허용하지 않습니다 (실제로 말해서는 안되며 버그가 있습니다).

대부분의 경우 이러한 오류의 원인은 잘못된 포인터 계산 또는 잘못된 배열 액세스입니다. 코드에서 단지 긴 3 초 것은, 내가 볼, 무언가가 액세스에 문제가 있습니다 때

조차 :

당신은 Tab[m][..]을 선언하지만 당신은 BTW 펑를 사용하여 (2 0에서 i에 걸쳐^m 루프 반복하는있어 그것을 계산하는 것은별로 좋지 않습니다. 대신 왼쪽 쉬프트 (< <)를 사용하십시오. 그런 다음 Tab[i][...]에 액세스하므로 대부분의 경우 선언되지 않은 색인에서 Tab에 액세스합니다.

+0

변수 m이 기록되므로 매우 작습니다. 알고리즘은'C '를 새로 할당 할 때 정확한 결과를 제공합니다. 그러나 오버랩은 여전히 ​​다른 어레이에서 발생합니다 !!. 놀랍게도 나는 2 << m만큼 pow를 대체 할 때 세분화 오류가 발생합니다! – nouveau

+1

m이 (가) 기록됩니까? 귀하의 게시 된 코드에서 당신은 확실히 m 행에 대해서만 공간을 할당하지만, 최대 2^m까지 행을 액세스합니다. 물론 m은 i의 로그이지만 로그 된 행만 할당했지만 모두 필요합니다. 그것은 할당의 종류와는 아무런 관련이 없습니다. 정적 배열, malloced 배열 또는 새로운 배열입니다. 할당 종류를 바꾸는 경우 버그는 그대로 있지만 명확한 오류 (명확한 segfaults) 대신 (현재는) 숨겨져있는 것이 더 낫습니다. – flolo

+0

지적 해 주셔서 고맙습니다. 나는 그것을 결코 짐작할 수 없었다! . 그것은 오류를 해결했습니다 :) – nouveau