모두의 코드 커뮤니티

Memset 함수 만들기 질문입니다

memset 함수를 공부를 해서 한번 비슷하게 만들어 보려고 하는데…
4byte 정수형 배열을 입력 받았을 때 는 출력하면 0이라는 숫자를 입력하면
0으로 배열의 모든 요소를 초기화 할 수 있는데요…

void* memset__(void* dest, int val, int size)

char형 배열을 dest 로 넣으니 제가 입력한 값을 처음에는 sizeof(dest) 로
int형이 면 4byte,
char 형이면 1byte 겠거니 하고 만들었는데…
void*형이라 항상 4byte 더라구요. 이런 상황에서 char형을 입력 받았는지 알 수 있는 방법이 있을까요?
지금은 int형 일 경우 0으로 초기화 되고 char형이면 1로 초기화 할 경우
1 0 0 0 / 1 0 0 0 이런식으로 출력 됩니다.

[

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
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <string.h>
 
void* memset__(void* dest, int val, int size)
{
    int count = 0;
    int* returnAnswer = nullptr;
    char* returnChar = nullptr;
    count = size / sizeof(dest);
    for (int i = 0; i < count; i++)
    {
        // void* 형 은 크기를 알 수 없기 때문에
        // 대입이 안된다. 그래서 (int*)으로 형변환 후
        // int* 로 선언된 returnAnswer에 대입을 한다.
        // 그 후 초기화를 0으로 했다.
        if (sizeof(dest) == 4)
        {
            returnAnswer = (int*)dest;
            returnAnswer[i] = val;
        }
        // sizeof 로 입력된 값이 char 형 이면 size 가 1일 거라고
        // 생각하고 작성했는데 포인터형이라 4byte인거같다.
        if (sizeof(dest) == 1)
        {
            returnChar = (char*)dest;
            returnChar++ = val;
        }
    }
    return dest;
}
 
int main()
{
 
    int ar[10] = { 1, 2, 3, 4, 5, 0, };
    sizeof(ar);
    int num;
    char chArr[10] = { ‘a’, ‘b’,‘c’, };
    
    memset__(ar, 0, sizeof(ar));
    memset__(chArr, 3, sizeof(chArr));
 
    for (int i = 0; i < 10; i++)
    {
        printf("%d \n", chArr[i]);
    }
 
    return 0;
}
cs
](
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
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <string.h>
 
void memset__(void* dest, int val, int size)
{
    int count = 0;
    int* returnAnswer = nullptr;
    char* returnChar = nullptr;
    count = size / sizeof(dest);
    for (int i = 0; i < count; i++)
    {
        // void* 형 은 크기를 알 수 없기 때문에
        // 대입이 안된다. 그래서 (int*)으로 형변환 후
        // int* 로 선언된 returnAnswer에 대입을 한다.
        // 그 후 초기화를 0으로 했다.
        if (sizeof(dest) == 4)
        {
            returnAnswer = (int*)dest;
            returnAnswer[i] = val;
        }
        // sizeof 로 입력된 값이 char 형 이면 size 가 1일 거라고
        // 생각하고 작성했는데 포인터형이라 4byte인거같다.
        if (sizeof(dest) == 1)
        {
            returnChar = (char*)dest;
            *returnChar++ = val;
        }
    }
    return dest;
}
 
int main()
{
 
    int ar[10] = { 1, 2, 3, 4, 5, 0, };
    sizeof(ar);
    int num;
    char chArr[10] = { ‘a’, ‘b’,‘c’, };
    
    memset__(ar, 0, sizeof(ar));
    memset__(chArr, 3, sizeof(chArr));
 
    for (int i = 0; i < 10; i++)
    {
        printf("%d \n", chArr[i]);
    }
 
    return 0;
}
cs
)

좋아요 1

sizeof(dest) 로 원래 입력받는 배열의 원소의 크기를 알 수 있는 방법은 없습니다.

참고로 memset 의 세 번째 인자 size 는 원소의 개수가 아니라, 값을 쓰려는 전체 배열의 크기를 의미합니다.

좋아요 1