inflearn logo
강의

講義

知識共有

ホン・ジョンモのついていきながら学ぶC言語

12.16 calloc(), realloc()

realloc() 함수 질문입니다.

解決済みの質問

273

saneum3

投稿した質問数 8

0

#include <stdio.h>

#include <stdlib.h>

int main()

{

int n = 10;

int* ptr = (int*)calloc(sizeof(int), n);

for (int i = 0; i < n; i++)

ptr[i] = i;

n = 30;

int* ptr2 = (int*)realloc(ptr, sizeof(int) * n);

printf("%p %p\n", ptr, ptr2);

for (int i = 0; i < n; i++)

printf("%d ", ptr[i]);

printf("\n");

for (int i = 0; i < n; i++)

printf("%d ", ptr2[i]);

free(ptr2);

ptr2 = NULL;

return 0;

}

안녕하십니까,,

int* ptr2 = (int*)realloc(ptr, sizeof(int) * n); 여기서realloc()함수가 sizeof(int)*30의 힙 메모리공간을 만들고 그 공간의 첫 번째 주소를 ptr2에 전달해주고 기존의 ptr이 가리키는 힙위치의 메모리를 free해준다고 아는데

for문을 통해 ptr[i]을 출력해봤더니 출력이 되네요ㅠ

ptr과 ptr2의 주소도 다르게 나오는데, realloc()함수가 기존의 ptr이 가리키는 메모리 공간을 free시켜준다고 배웠는데 제가 잘못 알고 있는걸까요??ㅠ

c

回答 2

0

saneum3

와 감사합니다,, 이해되었습니다.

0

sohyun

안녕하세요

realloc 이 free 시켜주는 것 맞습니다.

free 라는 개념이 해당 메모리 공간을 깨끗하게 0으로 다 초기화 시켜주고 아예 없앤다는게 아니라 해당 메모리 공간이 사용중이지 않은 free 한 메모리 풀로 돌아간다는 의미에 가까운 것 같습니다. (그러니 free 후에도 그 전에 메모리를 썼던 상태 그대로 free 공간에 들어간다는 의미입니다.)

그래서 저렇게 free 시키더라도 해당 주소로 접근하여 값을 출력하는 행위를 하면 그 이전에 값이 출력 될 수 있어요. free 한다고 해서 막 초기화까지 다 시켜주고 접근도 못하게 막아버리고 그런건 아닌 것 같아요! 더군다나 해당 메모리는 개발자가 자유롭게 쓸 수 있는 힙 메모리다 보니.. 다만 해당 메모리 공간은 이제 free 한 공간이라고 운영체제에게 알려주는 행위인 것 같습니다. 

	int* ptr = (int*)malloc(sizeof(int) * 5);
	ptr[0] = 3;

	free(ptr);
	ptr[0] = 2;

free 시켰기에 이제 해당 메모리는 사용자에게 allocate 되지 않은 공간임에도 저렇게 free 한 이후에 또 메모리에 접근하는게 에러가 나진 않았습니다. 다만, 메모리를 관리하는 주체인 운영체제 입장에선.. 저 ptr 이 free 한 공간이라고 알고 있기에, 뭔가 나중에 문제가 생길 소지가 있겠죠..? 

링크 참고해보시면 도움 되실 것 같아요.  https://stackoverflow.com/questions/15432123/using-pointer-after-free

Because freeing memory (a pointer) just puts back that memory on the free memory pool. The memory doesn't just disappear, and it's contents are not cleaned out till when that memory is allocated again and written to.

Export template 안됨

1

23

2

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

55

3

main 함수에서 왜 int만 선언이 되는걸까요

1

56

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

54

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

49

1

프로토타입과 함수간의 인자 불일치

1

73

2

12.12 헤더 관련 질문

1

60

2

Visual Studio Community 2026 사용 문의

1

138

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

61

2

getchar(), putchar()

1

93

3

강의자리ㅛ

1

80

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

114

2

소스파일안에 여러 파일

1

76

2

F5와 F7의 차이

1

77

2

c = TWO * (a+b); 에서 a와 b는?

1

58

2

; 세미콜론을 붙이는 기준에 문의

1

70

1

Step over 기능 문의

1

53

2

2.6 강의 따옴표 출력 규칙 문의

1

76

2

int main 함수 관련 오류 문의

1

67

2

13.4 words[0]

0

61

2

11.7 함수를 구현해 봤습니다.

1

62

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

65

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

53

2

11.6 fit_str함수를 구현해 봤습니다.

1

54

2