memset 
메모리를 지정한 문자로 채웁니다. 

Declaration 
void *memset( void *dest, int c, size_t count ) 

Return value 
성공 - 채워진 메모리 주소(dest 매개 변수) 반환 
실패 - 없음 


Parameters 
dest  - 채울 메모리의 주소 
c    - 채울 문자 
count - 채우려고 하는 문자 개수 


Detail descriptions 
memset()는 버퍼를 똑같은 "문자"로 채울 때 사용합니다. 명확하게 문자라고 표현했듯이 단위는 바이트입니다. memset()는 문자를 저장하는 char 배열뿐만 아니라 모든 종류의 배열에 대해서 사용할 수 있습니다. 그러나, 단위가 바이트이기 때문에 배열 요소의 자료형에 따라 세심한 주의가 필요합니다. 

대부분의 배열은 초기 상태로 0을 갖습니다. 그래서, {} 초기화를 사용해서 모든 요소에 대해 0을 지정하도록 합니다. 그러나, {} 초기화는 배열을 선언할 때 한번만 사용할 수 있고, 이후에는 일일이 모든 요소에 대해 0을 넣어줘야 합니다. 이와 같이 모든 요소를 0으로 채울 때, 배열 종류에 상관없이 사용하는 함수가 memset()입니다. 
  

20개짜리 double 자료형을 요소로 갖는 배열은 다음과 같이 처리합니다. 


    double array[20]; 
    memset( array, 0, 20*sizeof(double) ); 


반드시 요소 개수(20)에 요소 크기(sizeof(double))를 곱해야 합니다. 단위가 바이트이므로 20을 전달하면 double 자료형 3개(24바이트)에도 미치지 못하는 영역만 0으로 채워집니다. 요소 개수와 요소 크기를 곱할 때, 비로소 배열이 사용하는 전체 크기를 바이트 단위로 얻을 수 있습니다. 


char 배열에 대해서는 원하는 문자로 채워넣는 작업이 가능합니다. 모든 요소를 'h' 문자로 채우는 코드는 다음과 같습니다. 


  char str[256]; 
    memset( str, 'h', 256 ); 

결과를 출력해 보면, str 버퍼가 모두 'h'로 채워진 것을 알 수 있습니다. 그러나, 마지막 문자까지도 'h'이기 때문에 null 문자가 없어서 문자열이 되지는 못합니다. 문자열을 구성하려면 다음과 같이 합니다. 

    memset( str, 'h', 255 ); 
    str[255] = '\0'; 


마지막 이전까지만 원하는 문자로 채우고, 마지막 요소에는 null 문자를 직접 넣습니다. 

그러나, memset()를 사용해서 int 배열의 모든 요소를 5로 채울 수는 없습니다. int 자료형은 4바이트이고 memset()는 바이트 단위로 동작하기 때문에, 다음과 같은 코드는 올바로 동작하지 않습니다. 


    int array[10]; 
    memset( array, 5, 10*sizeof(int) ); 


초기화 영역의 크기는 정확하게 40바이트를 지정했지만, int 자료형이 갖는 4바이트에 포함된 바이트마다 5가 들어가기 때문에 16진수로 표현하면 0x05050505가 됩니다. 이 값을 출력해 보면 10진수로는 84215045가 됩니다. 단위가 바이트이기 때문에 char 요소가 아닌 배열을 원하는 값으로 초기화할 수 없다는 것을 명심하기 바랍니다. 

Remarks 
앞에서 0 이외의 원하는 값으로 int 배열을 초기화할 수 없다고 했는데, 실제로는 -1로 채울 수 있습니다. 0은 모든 비트가 꺼져있는 숫자를 말하고, -1은 모든 비트가 켜져있는 숫자를 말합니다. 모든 비트가 켜져있는 1바이트 숫자인 0xff가 -1인 것처럼 모든 비트가 켜져있는 4바이트 숫자 0xffffffff도 -1입니다. 0xff를 네 번 쓰면 0xffffffff가 되고 모든 요소를 -1로 초기화시키는 것이 가능합니다. 그러나, 배열 전체를 -1로 초기화할 때가 있을지는 모르겠습니다. 

"Example codes" 항목에 배열을 -1로 채우는 코드가 있습니다. 참고하기 바랍니다. 

Header files 
<string.h>  <memory.h> 

Example codes 
memset()로 int 배열을 초기화시키는 코드를 보여줍니다. 정수에 적용할 수 있는 0 또는 -1의 두 가지 패턴을 사용합니다. 
FillArray()는 sw 매개 변수에 전달된 값을 이용해서 배열 전체를 0 또는 -1로 채웁니다. 0을 사용할 때는 OFF 상수를, -1을 사용할 때는 ON 상수를 사용합니다. 
FillArray()에 포함된 if문은 ON도 아니고 OFF도 아닌 경우에 사용합니다. 그래서는 안되겠지만, 엉뚱한 값이 들어오면 ON으로 처리한다고 가정합니다. 
출력 결과를 보면, 모든 비트가 0이거나 1이라는 것을 알 수 있습니다. 
#include <stdio.h> 
#include <string.h> 

enum { ON = -1, OFF }; 

void FillArray( int* array, int size, int sw ); 
void ShowArray( int* array, int size ); 

void main() 

    int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

    printf( "원본 : " ); 
    ShowArray( array, 10 ); 

    ///////////////////////////////////// 

    FillArray( array, 10, OFF ); 

    printf( "OFF  : " ); 
    ShowArray( array, 10 ); 

    FillArray( array, 10, ON ); 

    printf( "ON  : " ); 
    ShowArray( array, 10 ); 


void FillArray( int* array, int size, int sw ) 

    if( sw != OFF ) 
        sw = ON; 

    memset( array, sw, size*sizeof(int) ); 


void ShowArray( int* array, int size ) 

    int i; 
    for( i = 0; i < size; i++ ) 
        printf( "%2d ", array[i] ); 

    printf( "\n" ); 


[출력 결과] 
원본 :  0  1  2  3  4  5  6  7  8  9 
OFF  :  0  0  0  0  0  0  0  0  0  0 
ON  : -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
  

memset()를 사용해서 구조체의 모든 멤버를 0으로 초기화합니다. 
PERSON 구조체는 이름(name)과 나이(age), 전화번호(phone) 멤버를 갖습니다. 더 많은 멤버가 있으면 좋겠지만, 지면 관계상 세 개만 넣었습니다. 멤버들의 자료형으로는 배열과 int 자료형을 사용했지만, 이들 외의 어떤 자료형이 멤버로 있어도 결과는 똑같습니다. 
출력 결과에서, 두 번째로 출력한 내용이 memset() 호출 후의 결과입니다. 모든 멤버가 0이 되었다는 것은 문자열은 null 문자로, int 변수는 0으로 채워졌다는 것을 뜻합니다. 문자열은 null 문자밖에 없으므로 아무 것도 출력되지 않았습니다. 
memset()를 배열이 아닌 구조체 변수에 대해 호출합니다. 구조체뿐만 아니라 int나 double 자료형에도 이처럼 사용할 수 있지만, 오히려 번거롭기 때문에 호출하지 않을 뿐입니다. 다만 구조체는 모든 멤버에 대해 일일이 0을 넣어줘야 하기 때문에 memset()를 사용하는 것이 훨씬 좋습니다. 
#include <stdio.h> 
#include <string.h> 

struct PERSON 

    char name[32]; 
    int  age; 
    char phone[16]; 
}; 

void InputPerson( struct PERSON* pPerson ); 
void OutputPerson( const struct PERSON* pPerson ); 

void main() 

    struct PERSON person; 

    InputPerson( &person ); 
    OutputPerson( &person ); 

    memset( &person, 0, sizeof(person) ); 
    OutputPerson( &person ); 


void InputPerson( struct PERSON* pPerson ) 

    printf( "[입력]\n" ); 
    printf( "이름 : " );    scanf( "%s",  pPerson->name  ); 
    printf( "나이 : " );    scanf( "%d", &pPerson->age  ); 
    printf( "전화 : " );    scanf( "%s",  pPerson->phone ); 


void OutputPerson( const struct PERSON* pPerson ) 

    printf( "\n[출력]\n" ); 
    printf( "이름 : %s\n", pPerson->name  ); 
    printf( "나이 : %d\n", pPerson->age  ); 
    printf( "전화 : %s\n", pPerson->phone ); 


[출력 결과] 
[입력] 
이름 : 김정훈 
나이 : 25 
전화 : 010-2730-8282 

[출력] 
이름 : 김정훈 
나이 : 25 
전화 : 010-2730-8282 

[출력] 
이름 : 
나이 : 0 
전화 :

, .