[42 Seoul] memset을 알아보자

youngmki·2021년 5월 4일
0

Libft

목록 보기
1/5
post-thumbnail

1. 구조

#include <string.h>
void *memset(void *s, int c, size_t len)

2. 기능

메모리를 원하는 크기만큼 특정 값으로 설정이 가능합니다.

3. Parameter

1) *void s

값을 채울 메모리의 시작 주소를 의미합니다.

2) int c

채울 값을 의미합니다.
인자로는 int로 들어오지만, 내부적으로 unsigend int로 형 변환이되어 활용됩니다.

3) size_t len

c로 채워질 바이트 수를 의미합니다.

4. 사용 예제

1. 문자 배열 변경

  • arr1의 시작 주소부터 len만큼 space를 넣어주었습니다.
#include <string.h>

int main(void)
{
char arr1[] = "aaaaa";
printf("적용 전: %s", arr1);

memset(arr1, " ", 3 * sizeof(unsigned char))
printf("적용 후: %"", arr2);

2. 배열 초기화

  • 우리가 for loop을 통해 배열을 초기화하듯, memeset을 통해서도 배열에 접근하여 초기화가 가능합니다.
#include <string.h>

void    printAll(int *pArr, int len)
{
    for (int i = 0; i < len; i++)
    {
        printf("%d", *(pArr + i));
    }
    printf("\n\n");
}

int     main(void)
{
    int arr1[20];
    for (int i = 0; i < sizeof(arr1); i++)
    {
        arr1[i] = 0;
    }

    printf("for based initializtion			: ");
    printAll(arr1, 20);


    int arr2[20];
    memset(arr2, 0, sizeof(arr1));

    printf("memset based initializtion		: ");
    printAll(arr2, 20);

    return 0;

}

5. 주의사항

앞서 언급하였듯 memset에 채워지는 값들을 의미하는 parameter인 int c의 경우, 내부적으로 unsigned char로 형변환되어 함수 내부에서 처리 됩니다.
이때 바이트 단위로 초기화가 이루어지게 되는데, int c 값에 0, -1을 넣을 수는 있지만, 그 외의 다른 수를 넣으면 당초 생각했던 결과와 다르게 처리가 됩니다.

  • 앞의 배열 초기화 코드를 활용하였습니다.

문제는 memset이 메모리를 채워넣는 방식에 있습니다.

예를 들어 인트 형 배열에 값을 넣고자 합니다.

int arr1[20];

이때 **memset(arr1, 0, sizeof(arr1))**를 사용하게 된다면

0x00000000 | 0x00000000 | 0x00000000 | ... 

처럼 메모리가 채워집니다.

반면, **memset(arr1, 1, sizeof(arr1))**의 경우에는

0x01010101 | 0x01010101 | 0x01010101 | ... 

처럼 값이 채워지게 됩니다.

참고로 int는 4바이트 값이기 때문에 우리가 생각하는 결과를 얻기 위해서는 다음과 같이 메모리가 채워져야 합니다.

0x00000001 | 0x00000001 | 0x00000001 | ... 

그래서 위와 같은 이상한 결과가 출력되었던 것입니다.

관심 있을 만한 포스트

1개의 댓글

comment-user-thumbnail
2021년 5월 6일

퍼가요~♡

답글 달기