C언어 Tip

memset 함수를 사용하는 이유

우리서로용서해요 2019. 2. 23. 00:46





#include <string.h> // string.h 파일이 필요합니다.
#include <stdio.h>

int main (){

    char a[20];

    // 1바이트마다 모두 65로 초기화
    // 배열을 채울 때는 sizeof()함수를 사용하면 됩니다.
    // sizeof 함수 - 배열의 전체 바이트 크기를 반환합니다.
    memset(a, 65, sizeof(a));

    // 출력을 통해 확인
    for(int i=0; i< (sizeof(a)/sizeof(char)); i++){
        printf("%c\n",a[i]);
    }

}
출처 : https://twpower.github.io/79-usage-of-memset-function



이 코드를 살펴보자

char형, 즉 글자 20개를 저장할 수 있는 a라는 배열인데, 그 배열에 ascii code 값 65번, 즉 'A'를 a배열에 모두 저장하게된다.

그래서 a배열을 for문을 돌려 출력하면


모두가 A가 나오는걸 확인할 수 있다.




그렇다면 굳이, for문을 돌려서 대문자 A를 저장할 수 있는데, 왜 이렇게 memset이라는 처음보는 함수를 통해서 저장할까?


이유는 두가지다.

1. for문으로 돌려서 저장시키는것보다 memset함수를 이용하는게 훨씬 빠르다고한다. (내용 출처 위 링크 참조)

2. 이 함수를 알면 초기화할때 편하다.


그래서 이렇게 하는것같다.




#include <string.h>
void *memset(void *dest, int c, size_t count);

설명

memset() 함수는 dest의 첫 번째 count 바이트를 값 c로 설정합니다. c의 값은 부호 없는 문자로 변환됩니다.

리턴값

memset() 함수는 dest에 대한 포인터를 리턴합니다.



두번째의 좋은 예이다. 한번씩 보거나 따라해보는것을 추천한다.

#include <string.h>
#include <stdio.h>
 
#define  BUF_SIZE  20
 
int main(void)
{
   char buffer[BUF_SIZE + 1];
   char *string;
 
   memset(buffer, 0, sizeof(buffer));
   string = (char *) memset(buffer,'A', 10);
   printf("\nBuffer contents: %s\n", string);
   memset(buffer+10, 'B', 10);
   printf("\nBuffer contents: %s\n", buffer);
}
 
/*******************  Output should be similar to:  ***************
 
Buffer contents: AAAAAAAAAA
 
Buffer contents: AAAAAAAAAABBBBBBBBBB
*/
출처 : https://www.ibm.com/support/knowledgecenter/ko/ssw_ibm_i_73/rtref/memset.htm