다음 메모리 할당 완료
int * a;
a = malloc (5 * sizeof (int));
무료로이 세트의 다섯 번째 위치를 말하는 방법이 있습니까?인접한 메모리 위치 집합에서 선택된 위치 삭제
즉 무료 (a + 4)를 할 수 있나요 ??
현재 세그먼트 화 오류가 발생합니다.
다음 메모리 할당 완료
int * a;
a = malloc (5 * sizeof (int));
무료로이 세트의 다섯 번째 위치를 말하는 방법이 있습니까?인접한 메모리 위치 집합에서 선택된 위치 삭제
즉 무료 (a + 4)를 할 수 있나요 ??
현재 세그먼트 화 오류가 발생합니다.
아니, 당신은 할 수없는 free(a+4)
등
이유는 무엇입니까? 왜냐하면 C 표준은 그것을 금지하기 때문입니다. malloc()
에 의해 반환 된 정확한 포인터를 포인터 계산없이 free()
으로 전달해야합니다.
http://www.kernel.org/doc/man-pages/online/pages/man3/free.3.html
메모리 공간이 이
free()
기능malloc()
,calloc()
또는realloc()
에 대한 이전 호출에 의해 반환되어 있어야합니다 PTR,가 가리키는 해제합니다.
표준에서 금지하는 이유는 무엇입니까? malloc()
의 일부 구현은 a-4
(또는 어디서든) 위치에 헤더 정보를 저장하고 free()
은 포인터 계산으로 내부적으로 읽는 것이기 때문입니다. a+4
과 같이 이동 된 포인터가 있으면 헤더 정보가 누락되어 망가질 수 있습니다. 당신이 궁금하다면
:
는 덧붙여 일부 libc의 구현은 할당 된 메모리 청크의 크기를 반환 비표준 기능을 제공 구현 방법과 소스 코드를 살펴보면 그들은 a-4
등의 헤더 정보를 읽어 다시 원래의 질문에
확인을. 을 malloc()
으로 할당 한 메모리 청크를 (또는 길게)으로 줄이려면 @Gustav가 말한대로 realloc()
을 사용할 수 있습니다. 그러나 메모리 덩어리의 중간에서 몇 바이트를 제거하려면 수동으로 다시 할당하고 복사해야합니다. 실제로 realloc()
은 내부적으로 유사한 작업을 수행 할 수 있으므로 반환 된 포인터는 원래 포인터와 다를 수 있습니다.
공간의 일부만 비우려면 realloc()을 사용하십시오.