2013-11-21 4 views
2

사용자 입력에서 매트릭스 크기 (dim)를 읽고 동적으로 n*n 행렬을 만들려고합니다. 그러나 매트릭스를 인쇄 할 때 프로그램이 충돌합니다.무료 매트릭스의 동적 매트릭스 문제

Stackoverflow에서 검색 한 결과 free() 오류 일 수 있습니다. 왜 그런지 모르지만 프로그램은 dim < 5 일 때 작동합니다.

 #include <stdio.h> 
     #include <stdlib.h> 

     typedef struct{ 
      float real, img; 
     }COMPLEXO; 

     void zeroIt(COMPLEXO **matrix, int dim){ 
      int i,j; 
      for(i=0;i<dim;i++){ 
       for(j=0;j<dim;j++){ 
        matrix[i][j].real=0; 
        matrix[i][j].img=0; 
       } 
      } 
     } 

     int main(void){ 
      int dim, i, j; 
      COMPLEXO **matrix; 
      int flag = 1; 
      /*Pedir Dimensao da Matrix*/ 
      printf("DIM: \n"); 
      scanf("%d", &dim); 
      /*Alocar espaço*/ 
      matrix = (COMPLEXO **) malloc(sizeof(dim) * sizeof(COMPLEXO)); 
      /*Alocar linhas*/ 
      for(i = 0; i < dim; i++){ 
       matrix[i] = (COMPLEXO *) malloc(sizeof(dim) * sizeof(COMPLEXO)); 
      } 
      if(matrix == NULL){ 
       printf("Erro"); 
       return; 
      } 

      /* Escrever dados */ 

      for(i=0;i<dim;i++){ 
       for(j=0;j<dim;j++){ 
        matrix[i][j].real = i; 
        matrix[i][j].img = j; 
       } 
      } 
      printf("#insert matrix - done\n\n"); 

      /* Imprimir dados */ 
      for(i=0;i<dim;i++){ 
       for(j=0;j<dim;j++){ 
        printf("%.f|%.f ", matrix[i][j].real, matrix[i][j].img); 
       } 
       printf("\n"); 
      } 

      printf("#print matrix - done \n\n"); 
      zeroIt(matrix, dim); 
      for(i=0;i<dim;i++){ 
       free(matrix[i]); 
      } 
      free(matrix); 
      printf("#free pointer - done \n\n"); 
      getchar(); 
      return 0; 
     } 

답변

0

쉬운 사람,

matrix = (COMPLEXO **) malloc(dim * sizeof(COMPLEXO*)); 
내가 업데이트
2

첫 번째 malloc은 sizeof(COMPLEXO*)이 아니고 sizeof(COMPLEXO) 이여 야합니다. 구조체 배열이 아닌 포인터 배열을 할당하고 있습니다.

+0

, 작업을 해달라고. – urb

+0

네, 이제 생각해 봅시다. 구조는 포인터의 크기 이상이어야합니다. 따라서 중요하지 않아야합니다. 프로그램이 정확히 어디에서 사망합니까? – happydave

0

포인터를 사용하기 전에 문제를 잡을 수 있도록 malloc 호출 바로 다음에 NULL 검사를 이동해야합니다 (오류의 경우는 아닙니다. 전체 RAM 및 스왑이 있어야합니다.)이 체험 :

 matrix = (COMPLEXO **) malloc(sizeof(dim) * sizeof(COMPLEXO)); 

     if(matrix == NULL){ 
      printf("Error"); 
      return; 
     } 

다음 할당 오류에 대한 검사를 완료하기 위해, 당신은 내부 검사를 추가해야합니다 귀하의 루프 :

 for(i = 0; i < dim; i++){ 
      matrix[i] = (COMPLEXO *) malloc(sizeof(dim) * sizeof(COMPLEXO)); 
      if(matrix[i]==NULL) 
      { 
       printf("Not enough memory"); 
       return ; 
      } 
     } 

당신은 다음 DIM의 일부 우스꽝 많은 수를 사용하여 테스트 할 수 2000000000입니다.

관련 문제