본문 바로가기
프로그래밍 언어/C 언어

[C/C++] memset 사용시 주의사항

by 까망 하르방 2021. 9. 11.
반응형

먼저 memset 함수의 기본적인 사용방법을 읽어보는 것을 추천드립니다.

 

[C / C++] memset 함수 사용

memset 함수는 memory + set 으로 특정 메모리 공간에 지정한 값을 채워준다. 함수 원형 void* memset(void* ptr, int value, size_t num); → memset (시작 포인터, 설정할 값, 크기) ① void* ptr ..

zoosso.tistory.com

 

예제 1

#include <stdio.h>
#include <string.h>

const int MAX_N = 2;

int main() {
    int arr[MAX_N];

    memset(arr, 1, sizeof(int) * MAX_N);

    for (int i = 0; i < MAX_N; i++) {
        printf("%d ", *(arr + i));
    }
    puts("");
}

int 타입  「 」 을 주어도 배열 원소를 1로 제대로 초기화하지 못하고 있다.

memset이 내부적으로  1 Byte 처리하고 있기 때문이다.

 

지정해준 값 (= value)를 unsigned char (1 byte)로 변경해서 메모리 블록을 다룬다.

▶ 1 Byte = 8 Bit 로  1 바이트(8 Bit) 단위 값으로 초기화 해주는 것이다.

 

int [] 원소 한개가 4 Bye를 찾지하고 이를 Bit로 표현하면 32 bit 이다.

→  0000'0000 0000'0000 0000'0000 0000'0000

 

의도한 값은  「 」 로 초기화된 값일 것이다.

→ 0000'0000 0000'0000 0000'0000 0000'0001

 

실제로는 8 Bit 단위(1 Byte)로 처리하기 때문에 아래와 같이 처리된다.

→ 0000'0001 0000'0001 0000'0001 0000'0001

→ 16 진법으로 표현하면 0x01010101

→ 10 진법으로 16843009 

 

결과적으로  「 0 」 과 char 타입은 큰 문제없이 원하는 값으로 설정할 수 있다.

e.g) char[] 문자열 값 변경, 숫자 배열을 「 0 」 으로 초기화

 

예제 2 - Bit를 한개씩 확인해보는 예제

#include <iostream>
#include <cstring>

using namespace std;

const int MAX_N = 3;

int main()
{
    int arr[MAX_N];
    memset(arr, 1, sizeof(arr));
    // 1 Byte = 8 Bit
    size_t size = sizeof(int) * 8;
    for (int i = 0; i < MAX_N; ++i)
    {
        for (int k = 0; k < size; ++k)
        {
            cout << ((arr[i] >> (size - (k + 1))) & 1);
        }
        puts("");
    }
    puts("");
}

 

Reference

[C / C++] memset 함수 사용 

윈도우 계산기 (프로그래머용) 

비트마스크 (Bitmask) 

[C++] [STL] fill 함수 사용해보기  

반응형

'프로그래밍 언어 > C 언어' 카테고리의 다른 글

[C/C++] do-while 문 형태와 활용  (0) 2021.11.22
[C] printf 서식  (0) 2021.09.14
[C / C++] memset 함수 사용  (0) 2021.09.11
[C] typedef enum 활용  (0) 2021.09.11
[C] 열거형 타입 enum 이란?  (0) 2021.09.10

댓글