2011-03-30 3 views
1

아래의 코드 샘플에서 realloc은 내 p1을 이동하거나 누수가있을 때 "1234567890"문자열에 할당 된 메모리를 해제합니다.내 데이터를 메모리에 복사 할 때 realloc이 얼마나 자유니까?

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

int main (int argc, char *argv[]) 
{ 
    char **p1 = NULL; 
    char *p2 = NULL; 
    int i; 

    p1 = (char **) malloc (100); 

    for (i = 0; i < 10; i ++) 
    { 
     p1[i] = (char *) malloc(10); 
     memcpy (p1[i], "1234567890", 10); 
    } 

    p2 = malloc (100); 

    p1 = (char **) realloc (p1, (1000 * sizeof(**p1))); 

    for (i = 0; i < 10; i ++) 
    { 
     fprintf (stdout, "p1: %s\n", p1[i]); 
    } 

    free(p1); 
    free(p2); 

    return 0; 
} 

답변

4

realloc는 한 수준의 깊이 간다. 인자가 void*으로 변환 되었기 때문에 포인터를 포인터로 전달한다는 것을 알지조차 모릅니다. 현재까지 malloc, reallocfree과 관련하여 메모리는 단순한 바이트 배열입니다. 포인터를 메모리에 저장할 경우 선택 사항이지만 malloc은 상관 없습니다.

그러나 포인터의 배열로 되풀이되지 않는 free(p1)까지 메모리 누수가 발생하지 않습니다. (realloc은 블록이 확대 되어도 버퍼에 저장된 포인터를 복사합니다. 축소하면 문제가 발생합니다.)

또한 오류 반환 여부를 확인하지 않기 때문에 프로그램 동작이 정의되지 않습니다. 다음 경우에만 작동합니다. sizeof(char *) < 10 :

p1 = (char **) malloc (100); 

for (i = 0; i < 10; i ++) 
{ 
    p1[i] = (char *) malloc(10); 
    memcpy (p1[i], "1234567890", 10); 
} 
관련 문제