아래 코드를 실행하면 주어진 결과가 나타납니다.C realloc 문자 배열의 겉보기 크기가 변경되지 않습니다.
#include <stdio.h> /* printf */
#include <stdlib.h> /* malloc, realloc */
int main()
{
char* characters = (char *) malloc(10 * sizeof(char));
printf("Before: characters at %p, size=%lu\n", (void *) characters, sizeof(characters)/sizeof(characters[0]));
char* temp = (char *) realloc(characters, 100);
if (temp)
{
printf("After realloc, characters size = %lu, temp size = %lu\n", sizeof(characters)/sizeof(characters[0]), sizeof(temp)/sizeof(temp[0]));
printf("After realloc, nums at %p, temp at %p\n", (void *) characters, (void *) temp);
//characters = temp;
free(temp);
}
free(characters);
}
/* Output:
Before: characters at 0x107b00900, size=8
After realloc, characters size = 8, temp size = 8
After realloc, nums at 0x107b00900, temp at 0x107b00910
test(3556) malloc: *** error for object 0x107b00900: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
*/
나는 무엇이 고장 났는지 알아 내려고하고있다. malloc은 10 개의 연속 문자를위한 공간을 제쳐두고 그 배열의 첫 번째 요소에 대한 포인터를 제공한다고 생각합니다. 포인터를 characters
에 저장합니다. 그런 다음 characters
크기를 인쇄하고 10을 기대하지만 8이됩니다. 처음으로 이상한 점입니다. 그런 다음 realloc에게 100 개의 연속 된 문자를위한 공간이 있고 첫 번째 지점에 대한 포인터를 나에게 반환하는 힙에서 새로운 위치를 찾도록 요청합니다. 포인터를 임시 변수에 넣습니다. temp
의 크기를 인쇄 할 때 100이 되더라도 다시 8이됩니다. characters
및 temp
에 대한 포인터를 인쇄하면 힙에 두 개의 다른 위치가 표시됩니다. 대개는 temp
이 가리키는 포인터를 가리 키도록 characters
포인터를 다시 할당합니다. 그렇다면 내 포인터를 무료로하려고했는데 0x107b00900
을 풀어 낼 수 없다고 말하면 정확한 위치는 characters
입니다. 그 시점의 객체는 malloc
에 없습니다. 그러나, 나는 malloc
characters
을위한 공간을했다. 왜 이런 일이 일어나는 걸까요? malloc
, realloc
, sizeof
등의 기능을 잘못 이해하고 있습니까? 도와 줘서 고마워.
그런 포인터에 sizeof를 사용할 수 없습니다. 그리고 mem 2x를 해제하십시오. –
포인터가 가리키는 배열의 크기를 가져 오는 데 사용할 수있는 함수는 무엇입니까? '임시'와 '캐릭터'는 다른 장소에 있습니다. 맞습니까? 그래서 나는 어디에서 두 번 풀어주는거야? – sredmond
@sredmond. 없음, 할당 된 크기를 직접 추적해야합니다. 성공하면'realloc()'문자로'else free (문자)'를해야합니다. – chux