2012-02-08 3 views

답변

0

아니, 당신은 할 수없는 free(a+4)

이유는 무엇입니까? 왜냐하면 C 표준은 그것을 금지하기 때문입니다. malloc()에 의해 반환 된 정확한 포인터를 포인터 계산없이 free()으로 전달해야합니다.

  • http://www.kernel.org/doc/man-pages/online/pages/man3/free.3.html

    free() 기능

    메모리 공간이 이 malloc(), calloc() 또는 realloc()에 대한 이전 호출에 의해 반환되어 있어야합니다 PTR,가 가리키는 해제합니다.

    • 리눅스 매뉴얼 페이지는 C 표준 자체는 아니지만 실질적으로 C 라이브러리 함수에 상응하는 정보를 포함한다.

표준에서 금지하는 이유는 무엇입니까? malloc()의 일부 구현은 a-4 (또는 어디서든) 위치에 헤더 정보를 저장하고 free()은 포인터 계산으로 내부적으로 읽는 것이기 때문입니다. a+4과 같이 이동 된 포인터가 있으면 헤더 정보가 누락되어 망가질 수 있습니다. 당신이 궁금하다면

:

는 덧붙여 일부 libc의 구현은 할당 된 메모리 청크의 크기를 반환 비표준 기능을 제공 구현 방법과 소스 코드를 살펴보면 그들은 a-4 등의 헤더 정보를 읽어 다시 원래의 질문에

확인을. malloc()으로 할당 한 메모리 청크를 (또는 길게)으로 줄이려면 @Gustav가 말한대로 realloc()을 사용할 수 있습니다. 그러나 메모리 덩어리의 중간에서 몇 바이트를 제거하려면 수동으로 다시 할당하고 복사해야합니다. 실제로 realloc()은 내부적으로 유사한 작업을 수행 할 수 있으므로 반환 된 포인터는 원래 포인터와 다를 수 있습니다.

0

공간의 일부만 비우려면 realloc()을 사용하십시오.