malloc, memset, free

minseok·2023년 6월 6일
0
post-thumbnail
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

0.	int main(void) {
1.  	int *pnData = NULL;
2.      pnData = (int*) malloc(sizeof(int) * 4);
3.      memset(pnData, 1, sizeof(int) * 4);
4.      printf("%p \n", pnData);
5.      printf("%p \n", pnData + 1);
6.      printf("%p \n", pnData + 2);
7.      printf("%p \n", pnData + 3);
8.      free(pnData);
9.   }

포인터 변수의 R value위치에서 연산자에 따른 차이
pnData : pnData가 가지고 있는 값
&pnData : pnData의 메모리 주소
*pnData : pnData가 가지고 있는 메모리 주소에 있는 값



2번 malloc(sizeof(int) * 4)

malloc()은 인자로 전달받은 크기(바이트 단위)만큼의 메모리를 운영체제로부터 동적으로 할당, 해당 메모리의 시작 주소를 반환합니다.
sizeof(int) * 4는 제가 사용하는 시스템에서는 int 타입은 32bit로 해석합니다.

pnData의 메모리주소(...ff368)메모리 주소(...04080)를 할당합니다.

그렇다면 4byte(32bit x 4)의 크기를 할당받고 정수 포인터방식으로 주소를 pnData 포인터 변수에 할당합니다.

3번 memset(pnData, 1, sizeof(int) * 4)

pnData에 저장된 주소의 시작 주소에서 세 번째 인자 sizeof(int) * 4의 크기 만큼 두 번째 인자 '1'으로 초기화합니다.

pnData의 값(...04080)부터 시작해서 sizeof(int) * 4크기만큼 모두 '1'로 초기화합니다.



5~7번 printf("%p \n", pnData + N)

pnData에 저장된 주소의 옵셋을 수행한 결과를 출력합니다.
pnData는 정수형이기 때문에 'sizeof(int)'의 옵셋 값(4byte)이 사용

pnData = ...04084
+1 = ...04084
+2 = ...04088
+3 = ...0408C



8번 free()

동적으로 할당받았던 메모리를 해제하고 운영체제에 반환합니다.
하지만 3번 과정에서 초기화한 값이 사라지거나 하지 않습니다.
(여전히 '1'이 해당 메모리에 유지)

이제 pnData는 Dangling Pointer입니다. NULL로 초기화하여 해당 주소를 참조하지 않도록 합니다.

https://stackoverflow.com/questions/47384803/why-does-the-c-function-free-not-delete-values

profile
즐겁게 개발하기

0개의 댓글