2014-04-07 3 views
-1

나는의 malloc를 사용하여 2 차원 배열을 만들려고 해요. 코드가 올바르지 만 값을 설정하려고하면 "Segmentation Fault"메시지가 나타납니다.분할 오류, 2 차원 매트릭스, malloc에 ​​

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

int main(){ 
    int i, j; 
    int **m = (int **) malloc(5 * sizeof(int)); 

    if(m == NULL){ 
     printf("Error"); 
     getchar(); 
     exit(-1); 
    } 

    for(i = 0; i < 5; i++){ 
     m[i] = (int *) malloc(5 * sizeof(int)); 

     if(m[i] == NULL){ 
      printf("Error"); 
      getchar(); 
      exit(-1); 
     } 
    } 

    for(i = 0; i < 5; i++){ 
     for(j = 0; j < 5; j++){ 
      printf("%d %d\n", i, j); 
      m[i][j] = 0; 
     } 
    } 

    for(i = 0; i < 5; i++){ 
     for(j = 0; j < 5; j++){ 
      printf("%d ", m[i][j]); 
     } 
     printf("\n"); 
    } 

} 

감사합니다.

+0

를 사용하는 경우도

이는 C 캐스트하지 않는 이유는 당신이 포인터의 배열을 할당이 문을 수정해야한다고 생각 태그 –

+0

C++과 같이'INT ** m = (INT **)의 malloc을 (5 * sizeof (int *)); ' – Ganesh

+0

메모리 누수가 있습니다. – SGG

답변

1

int의 크기가 포인터 변수의 크기가 동일하지 않은 경우 귀하의 코드가 실패합니다

int **m = (int **) malloc(5 * sizeof(int)); 

//---------------------------------------v 
int **m = (int **) malloc(5 * sizeof(int *)); 

로 변경합니다.

+0

이것은'int ** m = malloc (5 * sizeof * m)이라는 관용구를 사용함으로써 피할 수 있었을 것이다. –

0

일부 시스템은 INT의 크기가 동일하지 포인터의 크기가있을 수 있습니다. 귀하의 경우 포인터가 크기가 int라고 가정합니다.

int ** m = (int **) malloc (5 * sizeof (int));

변화 그것을

INT에 ** = m의 malloc (5 *를 sizeof (INT *)); 사용 후

항상 사용 가능한 메모리. 메모리 누수로 이어질 것입니다. malloc에 ​​Check here