memset의 초기화 방식

memset 함수로 원하는 숫자로 초기화가 가능할까?

int 기준 -1, 0 밖에 불가능하다.

  • 그 외 어떤수도 불가능하다.
  • 1 역시 불가능하다.

memset의 동작 원리

memset

  • memset은 byte 단위로 잘라서 초기화한다.
  • 이점을 생각하면 0-1이 왜 가능한지 알 수 있을것 이다.
  • 0은 4byte로 나타내면
    • 00000000000000000000000000000000 이다.
  • 이것을 1byte로 잘라내면
    • 00000000 이다.
    • 결과가 같다
  • -1은 4byte로 나타내면
    • 11111111111111111111111111111111 이다.
  • 이것을 1byte로 잘라내면
    • 11111111 이다.
    • 결과가 같다

이렇게, int 타입에서 잘라내어도 똑같은 값을 가지는 경우에만 의도한 결과를 낳을 수 있다

-1, 0, 1 예시

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

#include <iostream>
#include <cstring>

using namespace std;

int int_arr[3];


void test_1(){
    memset(int_arr, -1, sizeof(int_arr));
    cout << int_arr[2] <<"\n";
}

void test_2(){
    memset(int_arr, 0, sizeof(int_arr));
    cout << int_arr[2] <<"\n";
}

void test_3(){
    memset(int_arr, 1, sizeof(int_arr));
    cout << int_arr[2] <<"\n";
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);  cout.tie(NULL);
    freopen("input.txt", "r", stdin);

    test_1();
    test_2();
    test_3();

    return 0;
}

output

1
2
3
-1
0
16843009

1byte

char

  • 1byte 자료형에는, 원하는대로 초기화가 가능하다.
  • char의 경우, 1byte 자료형이기 때문에 가능하다.

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <cstring>

using namespace std;

char char_arr[3];

void test_char1(){
    memset(char_arr, 'B', sizeof(char_arr));
    cout << char_arr[2] <<"\n";
}

void test_char2(){
    memset(char_arr, char(3), sizeof(char_arr));
    cout << (int)char_arr[2] <<"\n";
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);  cout.tie(NULL);
    freopen("input.txt", "r", stdin);

    test_char1();
    test_char2();

    return 0;
}

output

1
2
B
3

  • 나의 경우, memset은 bool 자료형에만 주로 사용한다.
  • 원하는 원소로 배열을 채우고 싶다면, 반복문을 이용하거나
    • fill 함수를 이용하자