2016-08-12 3 views
2

realloc 동작에 대한 몇 가지 질문이 있습니다.realloc 감소

이 코드 예제에서
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int *str; 

    /* Initial memory allocation */ 
    str = malloc(5 * sizeof(int)); 
    *str = 1; 
    *(str + 1) = 2; 
    *(str + 2) = 3; 
    *(str + 3) = 4; 
    *(str + 4) = 5; 

    /* Reallocating memory */ 
    int i, j; 

    for (i = 5; i > 0; i--) { 
     str = realloc(str, i * sizeof(int)); 

     for (j = 0; j < i; j++) { 
      printf("%d", *(str + j)); 
     } 

     printf("\n"); 
    } 

    free(str); 

    return(0); 
} 
  1. , 나는 realloc 작은이 가장 높은 숫자를 드롭 것이라고 확신 할 수 있습니까?

  2. realloc은 마지막 메모리를 해제하고 동일한 주소를 str에 유지합니까? 또는 주소가 바뀌어도 현재 위치에 공간이 있는지 여부가 변경 될 수 있습니까?

+1

'realloc()'은 항상 새로운 주소 공간으로 이동할 수 있습니다. 예를 들어, 크기 블록마다 다른 메모리 영역을 사용할 수 있습니다. – Barmar

+0

C99과 C11은'realloc()'에 대해 아주 명확합니다 :'realloc' 함수는'ptr'가 가리키는 이전 객체를 할당 해제하고'size'에 의해 지정된 크기를 가진 새로운 객체에 포인터를 반환합니다 ._ 때로는 일부 구현에서는 새 객체가 이전 객체와 동일한 주소를 갖지만 이전 객체는 기술적으로 릴리스되었습니다. 이전에 할당 된 메모리에 합법적으로 액세스 할 수 없으므로 정의되지 않은 동작이 발생합니다. 그러므로 어떤 일이 일어날 지 테스트 할 방법이 없습니다. 대부분의 구현은 메모리 축소시 데이터를 이동하지 않지만 전혀 보장 할 수는 없습니다. –

답변

4
  1. 예. 메모리 블록 p 크기가 N이고 사용자가 realloc(p, M) 일 경우 realloc이 성공한 것으로 가정하면 결과는 p의 첫 번째 min(N, M) 바이트를 포함하게됩니다.

  2. 새 크기가 이전 크기보다 작더라도 주소가 변경 될 수 있습니다. realloc은이 경우에 대해 보증하지 않습니다 (실패 할 수도 있음).

+1

또한'realloc()'은 요청이 축소 되더라도 'NULL'을 반환 할 수 있습니다. –