2016-09-24 2 views
2

나는 C로 다이나믹 배열을 만드는 법을 배우려는 초보자입니다. 코드를 사용하여 코드를 만들면 코드가 나에게 오류를주지 않습니다. 블록을 실행하지만 충돌이 발생하면 오류가 발생합니다. 나는 추락이 내 기억을 자유롭게하는 것과 관련이 있다고 생각한다. 왜냐하면 코드가 충돌하기 전에 원하는 출력을 내고 있기 때문이다.어떻게 동적으로 할당 된 배열에서 메모리를 해제 할 수 있습니까?

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

int main() 
{ 

    int i, j; 
    int *p = (int *)malloc(sizeof(*p)); 

    printf("Hello World! I have created a dynamic array of 20x30 integers! \n"); 
    for (i = 0; i <= 19; i++) 
    { 
     p[i] = (int)malloc(sizeof(int*)); 
     printf(" %2d ", i); 
     for (j = i + 1; j <= 29 + i; j++) 
     { 
     p[i] = 0; 
     printf("%2d", j); 
     } 
    printf("\n"); 
    } 

    for (i = 0; i <= 19; i++); 
    { 
     free(p[i]); 
    } 
    free(p); 
    return 0; 
} 
+4

첫 번째 malloc은 단일 int에 대해 공간을 할당합니다. – tkausl

+2

덧붙여서,'p [i] = (int) malloc (sizeof (int *)); '가 잘못되었습니다. 'p [i]'는'int'이며 포인터가 아니기 때문에 거기에 포인터를 저장하면 안됩니다. 많은 시스템에서'int'와 포인터의 크기가 다르므로 코드가 충돌을 일으킬 수도 있습니다. – kaylum

+0

[고정 코드] (http://ideone.com/WWiYZL) – BLUEPIXY

답변

0

여기가 문제입니다.

먼저, 첫 번째 malloc 호출은 1 요소 배열을위한 공간을 할당합니다.

그런 다음 두 번째의 malloc 호출뿐만 아니라 약간 잘못된

int *p = (int *)malloc(sizeof(int*) * 20); 

int *p = (int *)malloc(sizeof(*p)); 

에서를 변경하고 싶을 것이다.

p[i] = (int)malloc(sizeof(int*)); 

당신은 단지 잘못된 장소에 별표를 넣어

p[i] = (int *)malloc(sizeof(int)); 

로 변경해야합니다.

마지막으로 실제로 20 요소 배열 만 만듭니다. inner for 루프에서하는 일은 배열의 각 셀에 값 0을 할당하는 것입니다. 당신이 20x30 배열을 확인하려면, 당신은 항상 (어쨌든 컴파일러는 비 동적 2 차원 배열을 수행 궁극적으로 무엇을하는) 쉬운 경로를 타고 1 차원 배열을 생성하고 약간의 수학을 사용할 수 있습니다

int main() 
{ 
    int *p = (int *)malloc(sizeof(int) * 600); 
    ... 
    for (i = 0; i <= 19; i++) 
    { 
     printf(" %2d ", i); 
     for (j = 0; j <= 29; j++) 
     { 
      p[i * 30 + j] = 0; // It's i * 30, not i * 20 because you have to skip the space that the 'j' dimension takes up. 
      printf("%2d", j); 
     } 
     printf("\n"); 
    } 

    free((void*)p); //I found the program crashes without the void* cast 
} 

I을 이 코드를 테스트하고 실행합니다.

희망이 도움이됩니다.

+1

'int * p;와 함께''p [i]'는'int'로 평가됩니다. 포인터 ('malloc()'의 결과)가'int'에 저장되는 것을 원하지 않습니다. – alk

+0

또한이'p [i] [j]'는 컴파일되지 않습니다. – alk

+0

alk, 나는 이것을 서둘러 썼다. 그리고 아마도 오류가 있다는 것을 알았다. 더 나은 솔루션으로 해결했습니다. – anonymoose

관련 문제