2013-04-11 1 views
0

무엇이 잘못되었는지 말해주세요.프로그램의 정의되지 않은 동작입니다. 때로는 작동하는 데 때때로 오류가 발생합니다.

2 차원 동적 배열 만들기 : 포인터의 배열을 만든 다음 각 포인터마다 블록을 할당했습니다. 여기

코드입니다 :

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

int main() 
{ 
    int i, j; 
    int **a = NULL; 

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

    if (NULL == a) 
    { 
     printf("Failed to allocate memory."); 
     return 1; 
    } 

    for (i = 0; i < 10; i++) 
     a[i] = (int *)malloc(10*sizeof(int)); 

    for (i = 0; i < 5; i++) 
    { 
     for (j = 0; j < 10; j++) 
      a[i][j] = i*j; 
    } 

    for (i = 0; i < 5; i++)   // While running it prints this array. But... 
    {         
     for (j = 0; j < 10; j++) 
      printf("%4d", a[i][j]); 
     printf("\n"); 
    } 

    /* Trying to free allocated memory. */ 
    for (i = 0; i < 5; i++)   // ... sometimes app crashes around here. 
    { 
     free(a[i]); 
    } 

return 0; 
} 
같은 정의되지 않은 동작의 이유를 볼 수 없습니다

...

+3

'malloc (5 * sizeof (int *)'-'(i = 0; i <10; i ++)) [i] = ...'- 문제가 있습니까? – Mat

답변

4

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

이 목록에 5 포인터를위한 충분한 공간을 생성한다이 줄 정수

다음 글 쓰기

for (i = 0; i < 10; i++) 
    a[i] = (int *)malloc(10*sizeof(int)); 

어디에서 10 개를 사용하려고하십니까?

따라서 정의되지 않은 동작입니다. 10을 5로 변경하거나 정확한 공간을 할당하십시오.

2

에드 힐 및 매트는 문제가있는 곳을 보여 주므로이 문제가 다시 발생하지 않도록하는 방법을 알려 드리겠습니다.

코드에 "Magic Numbers"를 사용하지 마십시오.

할당 할 때 크기를 정확히 한 번 사용하여 변수에 넣은 다음 크기가 필요한 곳에서 그 변수를 사용하십시오.

int an = 5; 
a = (int **)malloc(an * sizeof(int *)); 

... 

for (i = 0; i < an; i++) 
    a[i] = (int *)malloc(10*sizeof(int)); 

Ed는 나를 상기시켜주기 때문에 변수 일 필요는 없습니다. 전처리 기 매크로를 사용할 수 있습니다.

#define AN 5 

또는 enum을 사용할 수도 있습니다.

enum { AN = 5 }; 

이 두 옵션은 숫자가 상수 일 때 일반적으로 더 좋습니다 (변수는 다양합니다).

+1

'# define'은 상수 일 때와 마찬가지로 좋을 것. –

관련 문제