void *ft_memset(void *ptr, int value, size_t num)
#include "libft.h"
void *ft_memset(void *ptr, int value, size_t num)
{
unsigned char *temp;
size_t i;
temp = (unsigned char *) ptr; //void 포인터를 이용해 unsigned char 포인터로 캐스팅
i = 0;
//num만큼 반복하면서 메모리영역 초기화
while (i < num)
{
temp[i] = (unsigned char)value; //현재 인덱스에 value값을 저장
i++;
}
return (temp); //초기화된 메모리 영역의 포인터 반환
}
#include <stdio.h>
#include "libft.h"
int main() {
char buffer[50];
// 버퍼를 0으로 초기화
ft_memset(buffer, 0, sizeof(buffer));
// 결과 출력
printf("초기화된 버퍼: ");
for (int i = 0; i < 10; i++)
{ // 처음 10바이트 출력
printf("%d ", buffer[i]);
}
printf("\n");
// 버퍼를 'A'로 초기화
ft_memset(buffer, 'A', 10);
// 결과 출력
printf("A로 초기화된 버퍼: ");
for (int i = 0; i < 10; i++)
{ // 처음 10바이트 출력
printf("%c ", buffer[i]);
}
printf("\n");
return 0;
}
ft_memset함수는 void 타입으로 주소를 받는다. void 타입은 어떤 타입의 포인터든 받을 수 있기 때문에 문자열, 배열 등 여러 타입의 메모리 영역을 초기화 할 수 있다. 하지만 주의해야 할 점이 있다.
ft_memset은 어떤 자료형의 포인터든 받을 수 있지만, 메모리를 채울 때에는 항상 1byte씩 채운다.
이것이 문제가 되는 이유는 char 자료형은 하나당 1byte라 문제가 되지 않지만 int 자료형은 하나당 4byte라 문제가 발생하게 되는것이다.
int main()
{
int arr[2]; // 2개의 int 요소를 가진 배열
ft_memset(arr, 1, sizeof(arr)); // 8바이트(2 * 4바이트) 크기의 메모리를 1로 채움
// 배열 출력
for (int i = 0; i < 2; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
우리는 ft_memset(arr, 1, sizeof(arr));을 이용하여 arr배열의 모든 요소를 1로 초기화 하려고한다.
우리가 원하는 결과는 아래이다.
1 1
하지만 실제 결과는
16843009 16843009
이렇게 나올것이다.
이 이유는 ft_memset이 바이트 단위로 작업하기 때문에 각 int는 1이 아닌 0x01010101로 설정될 것이고 이것의 10진수 값은 16843009이기 때문이다.
즉 4바이트짜리 1을 1바이트로 나타내려 했기 때문에 문제가 생기는 것이다.
그래서 ft_memset에 int값이 들어가는 경우는 메모리를 0으로 세팅하는 경우에만 사용이 가능하다. 0은 1바이트는 4바이트든 똑같이 0이기 때문이다.