malloc / memset

WanJu Kim·2023년 10월 10일

Function

목록 보기
6/7

malloc

c++ 에서는 new와 비슷하다.
c언어에서 주로 쓰이던 것으로 메모리를 할당받는 함수다. stdlib.h에 있다.
이런 식으로 사용한다.

char* test = (char*)malloc(sizeof(char) * 4);
int* test1 = (int*)malloc(sizeof(int) * 4);

꽤나 모양이 비슷하다. 전체적으로 보면 이렇다.

포인터자료형 변수이름 = (포인터자료형)malloc(할당받을크기);

할당 받을 크기는, 아무 숫자나 대충 '24' 뭐 이런 식으로 쓰는 것보다는, 자료형에 맞게 sizeof()를 사용하는 것이 훨씬 용이하다. 또한 malloc 함수는 (void*)형을 반환하기 때문에, 넣을 변수의 자료형에 맞게 변환시켜주면 된다.

메모리를 할당받았기 때문에, '반드시' 해제를 해주어야 한다. 해제 해주는 함수는 free다.

char* test = (char*)malloc(sizeof(char) * 4);
int* test1 = (int*)malloc(sizeof(int) * 4);

free(test);
free(test1);

어쨌든 저런 식으로 쓰면, 값을 넣은 게 아니라 단순히 메모리만 할당 받은 것이다. 그래서 저 직후는 쓰레기 값이 들어가있다.

그래서 malloc이랑 사용하기 좋은 게 memset이다.

memset

memory.h or string.h에 들어있다.

memset(void* _Dest, int _Val, size_t _Size);

memset으로 특정 메모리에 들어있는 값을 초기화시킬 수 있다.
첫 번째 인자에 메모리 주소를,
두 번째 인자에 어떤 값으로 초기화시킬지,
세 번째 인자에 메모리 주소로부터 얼마만큼 크기를 초기화시킬지
를 적으면 된다.

예시

int* test1 = (int*)malloc(sizeof(int) * 4);
memset(test1, 0, sizeof(int) * 4);

이러면 'test1 메모리 주소에서, sizeof(int) * 4의 크기만큼, 0으로 초기화 해달라.' 이런 뜻이다. malloc과 비슷하게 sizeof()를 적절히 활용한다.

실제로 써보면,

아까는 쓰레기 값이 들어가 있었는데, 초기화가 되었다.

char*와 malloc

char*와 malloc의 예시를 들겠다.

char*형의 메모리를 할당 받았는데 오잉? 쓰레기 값인데 특이하게 한자가 들어가있다. 놀라지 말고 memset을 사용한다.

이러면 값이 제대로 초기화 되었다. 근데 한 가지 더 해줘야 한다. char형이기 때문에, 마지막에 널 문자를 추가해주어야 한다. 안 하면 어떻게 되냐고? 값이 이상하게 들어갈 수 있다. 예를 들어,

sizeof(char) * 2의 크기만큼 할당 받았는데, answer[2]에 널 문자가 없으니 char의 끝이라고 인식을 하지 못하는 경우이다. 이때 널 문자를 넣으면?

값이 제대로 들어감을 확인할 수 있다.

profile
Question, Think, Select

0개의 댓글