2016-10-16 10 views
1
int *p=malloc(20); 

이제 힙은 20 바이트의 메모리를 할당합니다. 그리고 첫 번째 바이트의 주소를 포인터 p로 반환합니다 (NULL 포인터가 반환되지 않는다고 가정).Malloc, Realloc, 무료

지금 내가 이렇게

int *q=realloc(p, 40); 

이제 다음과 같다 가능성 :

1]. q = p

2]. q! = p

3].

이제
free(p); 

어떻게됩니까 : Q = NULL

내가 연락 해주기 가능성 2와 3

에 대해 잊어 버렸습니까?

첫 번째 20 바이트는 사용 가능 상태가되고 나머지는 여전히 할당 된 상태로 유지되거나 40 바이트가 모두 무료 또는 다른 것으로 제공됩니까?

+2

'realloc'이 널이 아닌 포인터를 리턴하면, 전달 된 포인터는 무효화됩니다 (즉,'free'd). 직접하지 않아도됩니다. – tkausl

+2

40 바이트를 비울 것입니다. 재 할당시 아무 것도 움직일 필요가없는 것입니다. –

+1

'q == p'이면'free'에 전달하는 데 아무런 차이가 없습니다. 어떤 변수를 사용했는지는 알지 못하지만 그 값만 알 수 있습니다. 그러나 그것은 나쁜 습관 일 것이고, 나는 그것을 학문적 인 질문으로 생각합니다. –

답변

5

무료로 전화하면 정의되지 않은 동작이 발생합니다. 여기에 이유가 있습니다 :

함수 realloc은 포인터 p에 의한 공간 포인터를 할당 해제합니다.

개체 p의 수명 은 할당 해제시에 끝납니다.

함수 free는 할당 해제 된 공간에 대한 포인터를 받고 정의되지 않은 동작을 발생합니다. .

또한 realloc 호출 후의 포인터 p 값은 불확정하고 그 사용은 트랩 표현으로 인해 정의되지 않은 동작을 일으킬 수 있습니다.

즉, 포인터가 realloc 지점에서 포인터 p와 같은 공간의 시작 부분으로 돌아온 경우에도 realloc에 ​​의해 할당 된 객체는 새로운 수명을 가진 새로운 객체로 간주되며 포인터를 사용하여 할당이 해제되지 않을 수 있습니다 피.
realloc과 기능이 기존의 객체가 ptr이 가리키는 할당을 취소하고 새로운 개체에 포인터를 반환


1 (2는 201x 7.22.3.5 realloc과 기능 :/IEC 9899 ISO에서 인용) 크기로 지정된 크기입니다. (할당 된 개체의 수명이 해제

3까지 할당 로부터 연장
인용

2 은 (201x 7.22.3 메모리 관리 기능 1 : ISO/IEC 9899에서 인용) from : ISO/IEC 9899 : 201x 7.22.3.3 자유 함수 2)
인수가 메모리 관리 함수에 의해 이전에 리턴 된 포인터와 일치하지 않거나 free 또는 realloc에 ​​대한 호출로 공간 할당이 해제 된 경우, 동작은 정의되지 않습니다.

4 을 (: 9899 ISO/IEC :에서 인용 개체 201x 6.2.4 보관 기간 2) 개체가 (또는 과거)을 가리키는 엔드에 도달 할 때 포인터
값은 불확정하게 그것의 평생의.

0

는 malloc에 ​​/ realloc과 남자 페이지에서

과 realloc() 함수는 크기에 ptr이 가리키는 할당의 크기를 변경하려고하고, 반환 ptr에. ptr이 가리키는 메모리 할당을 확대 할 공간이 충분하지 않은 경우 realloc()은 새로운 할당을 생성하고 이 ptr이 가리키는 이전 데이터를 복사하여 새 할당에 맞 춥니 다. 은 이전 할당하고 할당 된 메모리에 대한 포인터를 반환합니다.

당신은 어떻게 malloc(), free()realloc() 작품에 대해 살펴 보도록한다. 가장 쉬운 방법은 간단한 구현입니다.

http://arjunsreedharan.org/post/148675821737/write-a-simple-memory-allocator

+0

linux man 페이지는 일반적으로 Linux 시스템에서 기능이 구현되는 방식에 대한 동작을 설명하며 다른 플랫폼의 표준 C 사양 및 동작과 다를 수 있습니다. –

-2

으로 realloc (p, new_size) 메모리 블록 이전의 malloc은 calloc 또는 호출에 할당 된 페이지 크기를 가리키는. 메모리가 이전에 할당 된 메모리 근처에서 사용할 수있는 경우 여기에 p 과 같은 포인터를 반환하므로이 경우 p & q가 가리키는 공간이 비워지면 (q) 삭제됩니다 .

하지만 메모리가 이전에 할당 된 메모리에 인접를 사용할 수없는 경우 다음 새로 새로 할당 된 공간은 두 경우 모두 메모리에

삭제됩니다 당신이 (Q) 무료 경우이 경우 있도록 공간을 할당에 대해 서로 다른 포인터를 반환 삭제 된 40 비트입니다.