Namespaces
Variants

memset, memset_explicit, memset_s

From cppreference.net
< c ‎ | string ‎ | byte
헤더 파일에 정의됨 <string.h>
void * memset ( void * dest, int ch, size_t count ) ;
(1)
void * memset_explicit ( void * dest, int ch, size_t count ) ;
(2) (C23부터)
errno_t memset_s ( void * dest, rsize_t destsz, int ch, rsize_t count ) ;
(3) (C11부터)
1) dest 가 가리키는 객체의 첫 count 개 문자 각각에 ( unsigned char ) ch 값을 복사합니다.
dest 배열의 끝을 넘어서 접근이 발생하면 동작은 정의되지 않습니다. dest 가 널 포인터인 경우 동작은 정의되지 않습니다.
2) (1) 과 동일하지만, 민감한 정보에 대해 안전합니다.
3) (1) 과 동일하지만, 다음 오류들이 런타임에 감지되고 대상 범위 [ dest, dest + destsz ) 의 모든 위치에 ch 를 저장한 후 현재 설치된 constraint handler 함수를 호출합니다( dest destsz 가 자체적으로 유효한 경우):
  • dest 가 null 포인터인 경우
  • destsz 또는 count RSIZE_MAX 보다 큰 경우
  • count destsz 보다 큰 경우 (버퍼 오버플로우가 발생할 경우)
dest 가 가리키는 문자 배열의 크기가 count <= destsz 보다 작은 경우 동작은 정의되지 않습니다. 다시 말해, destsz 의 잘못된 값은 임박한 버퍼 오버플로우를 노출하지 않습니다.
모든 경계 검사 함수와 마찬가지로, memset_s 는 구현에 의해 __STDC_LIB_EXT1__ 가 정의되고 사용자가 __STDC_WANT_LIB_EXT1__ 를 정수 상수 1 으로 정의한 경우에만 사용 가능함이 보장됩니다. <string.h> 를 포함하기 전에 정의해야 합니다.

목차

매개변수

dest - 채울 객체에 대한 포인터
ch - 채우기 바이트
count - 채울 바이트 수
destsz - 대상 배열의 크기

반환값

1,2) dest 의 복사본
3) 성공 시 0을 반환하고, 오류 시 0이 아닌 값을 반환합니다. 또한 오류 발생 시, dest 가 null 포인터가 아니고 destsz 가 유효한 경우, 대상 배열에 destsz 개의 채우기 바이트 ch 를 기록합니다.

참고 사항

memset 는 이 함수로 수정된 객체가 수명 동안 다시 접근되지 않으면 (예: as-if 규칙에 따라) 최적화되어 제거될 수 있습니다 (예: gcc bug 8537 ). 이러한 이유로 이 함수는 메모리를 소거하는 데 (예: 비밀번호를 저장했던 배열을 0으로 채우는 등) 사용할 수 없습니다.

이 최적화는 memset_explicit memset_s 에 대해 금지됩니다: 이들은 메모리 쓰기를 수행한다는 것이 보장됩니다.

이를 위한 타사 솔루션으로는 FreeBSD의 explicit_bzero 또는 Microsoft의 SecureZeroMemory 가 있습니다.

예제

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
    char str[] = "ghghghghghghghghghghgh";
    puts(str);
    memset(str,'a',5);
    puts(str);
#ifdef __STDC_LIB_EXT1__
    set_constraint_handler_s(ignore_handler_s);
    int r = memset_s(str, sizeof str, 'b', 5);
    printf("str = \"%s\", r = %d\n", str, r);
    r = memset_s(str, 5, 'c', 10);   // count is greater than destsz  
    printf("str = \"%s\", r = %d\n", str, r);
#endif
}

가능한 출력:

ghghghghghghghghghghgh
aaaaahghghghghghghghgh
str = "bbbbbhghghghghghghghgh", r = 0
str = "ccccchghghghghghghghgh", r = 22

참고문헌

  • C17 표준 (ISO/IEC 9899:2018):
  • 7.24.6.1 memset 함수 (p: 270)
  • K.3.7.4.1 memset_s 함수 (p: 451)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.24.6.1 memset 함수 (p: 371)
  • K.3.7.4.1 memset_s 함수 (p: 621-622)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.21.6.1 memset 함수 (p: 333)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.11.6.1 memset 함수

참고 항목

버퍼를 다른 버퍼로 복사합니다
(함수)
(C95)
주어진 와이드 문자를 와이드 문자 배열의 모든 위치에 복사합니다
(함수)