ft_memset

jaehlee·2025년 4월 11일

Libft

목록 보기
1/26

1. ft_memset함수란?


memset함수는 주어진 메모리 영역을 특정값으로 세팅하는 함수이다.

2. ft_memset함수 프로토타입

void *ft_memset(void *ptr, int value, size_t num)

매개변수

  • void *ptr는 세팅하고자 하는 메모리의 시작 주소를 나타낸다
  • int value는 메모리에 세팅하고자 하는 값이다.
    int 타입으로 받지만 내부에선 unsigned char로 변환하여 저장한다.
  • size_t num는 value로 세팅할 바이트의 크기이다.

리턴값

  • *ptr값을 리턴한다. 즉 변환이 시작된 주소값을 리턴해준다.

3. 함수구현

#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;
}

4. 주의점

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이기 때문이다.

profile
공부하는 개발자

0개의 댓글