2012-07-30 9 views
0

세그먼트 오류가 있으며 실수가 어디인지 알고 싶습니다.2D 배열의 포인터

설명해 드리겠습니다. recuperationinfoFich(int* * * * matricegroupegeneralisant)

이 기능 recuperationinfoFichrecuperationmatricegroupesgeneralisants(matricegroupegeneralisantA[Ni]); 이 함수가 선언 된 다른 함수를 사용 : 다음 주 함수 recuperationinfoFich(&matricegroupegeneralisant); 이 기능은 다음과 같이 선언합니다 int*** Matricegroupegeneralisant

: 내 주에서

, 나는 3 차원 배열을 선언

012 : recuperationmatricegroupesgeneralisants(int*** matricegroupegeneralisant)

내 코드로 GDB와 378,729,476,

:

(gdb) r 
Starting program: /home/larimsna1/Desktop/a.out 

Breakpoint 1, 0x000000000040061a in main() 
(gdb) n 
Single stepping until exit from function main, 
which has no line number information. 

Program received signal SIGSEGV, Segmentation fault. 
0x00000000004005c8 in recuperationmatricegroupesgeneralisants() 
(gdb) 
+0

디버깅을 위해 무엇을 했습니까? segfaulting 장소를 찾으셨습니까? 나는 gdb를 사용하거나 segfaulting 코드를 찾을 수있다. – dtech

+0

segmenetation 결함이나 다른 유형의 크래시를 얻을 때 가장 먼저해야 할 일은 디버거를 사용하는 것이다. 충돌이 발생한 위치를 찾는 데 도움이되며 변수를 검사하여 원인을 파악할 수 있습니다. –

+0

또한,'recuperationinfoFich'와'allocationdynamiquetableautroisdimdentier'를 적절하게 호출하는 동안'recuperationmatricegroupes generals '를 적절하게 호출하지 마십시오. 'recuperationmatricegroupes generals'에서 전달 된 인수를 사용하여 _Or_합니다. –

답변

1

나는 문제가 할당 기능을 함께 할 수있는 뭔가가 생각한다. 즉, 제공 한 코드에는 기능적 및 문체적인 문제가 많이 있습니다. 한 곳에서 포인터를 역 참조하지 못하여 포인터 유형에 정수를 할당하게됩니다. 인수를 전달하지 않고 반환 값을 사용하기 만하면 대부분의 트랜잭션에 불필요하게 포인터를 사용할 수 있습니다.

이 코드는 당신이 원하는 일을해야하고, 제대로 작동해야하고, 쉽게 읽을 수 있습니다 :

// allocation, returns pointer to allocated value 
int *** allocationdynamique(int nbniveau, int nbligne, int nbcolonne) 
{ 
    int *** Matrice; 
    int i, j; 
    Matrice = (int ***) malloc (sizeof(*Matrice) * nbniveau); 
    for (i = 0; i < nbniveau; ++i) 
    { 
     Matrice[i] = (int **) malloc (sizeof(**Matrice) * nbligne); 
     for (j = 0; j < nbligne; ++j) 
     { 
      Matrice[i][j] = (int *) malloc (sizeof(***Matrice) * nbcolonne); 
     } 
    } 
    return Matrice; 
} 

// computation, takes 2D array, modifies in place 
void recuperationmatrice(int** matrice) 
{ 
    matrice[0][1] = 1; 
} 

// you shouldn't use void main, its not part of the standard 
int main(int args, char **argv) 
{ 
    int*** matrice = allocationdynamique(3, 3, 7); 
    recuperationmatrice(matrice[1]); 

    return 0; 
} 

또한, 문체 관점에서, 당신의 변수 이름은 터무니없이 긴, 당신은 주변의 공간을 사용한다 연산자.

이 코드의 많은 실수는 컴파일러가 감지하고 경고 할 수있는 실수입니다. 유효하게 컴파일되는 유효한 C 코드이지만이 경우와 대부분의 경우에는 오류가 발생하여 의도 한대로 작동하지 않습니다. 가능한 사고를 제거하기 위해 컴파일러 경고로 컴파일해야합니다 :

gcc -Wall -c file.c -o file.o 
+1

한 단어 이상인 변수 또는 함수 이름이있는 경우 양식 문제에 대한 요점을 추가하기 만하면 [camel case] (http://en.wikipedia.org/wiki/CamelCase) it 또는 밑줄을 추가하십시오. 예 : 'allocationdynamique'를'allocationDynamique' 또는'allocation_dynamique'로 변경하십시오. –

+1

내가 본 모든 명명 규칙, 대문자 변수 이름 및 밑줄이없는 모든 소문자 함수 이름은 그 중 하나가 아닙니다. 일반적으로 당신이 사용하는 스타일은 비록 당신이 자신의 것을 고를지라도 아무런 결과가 없지만 일관성의 중요성을 강조 할 수는 없습니다. 특정 스타일로 작성된 코드를 읽는 것이 당신에게는 어렵고 다른 사람들에게는 어렵습니다. 하나의 스타일을 골라서 붙이십시오. 또한 고든은 닌자입니다. – Wug