Home » 레퍼런스 » C » c언어 memset 함수를 알아봅시다.

c언어 memset 함수를 알아봅시다.

배열 전체를 특정한 값으로 초기화 하는 함수가 없을까요? memory.h에는 c언어 memset 함수가 있습니다. 이 함수가 무엇을 하는 함수인지 알아봅시다.


[그림 1] c언어 memset 함수의 원형

함수의 원형은 위와 같습니다.

  • ptr
    • 특정한 값으로 초기화할 공간의 시작 주소
  • value
    • 어떤 값으로 초기화 할 것인지
  • num
    • 몇 byte만큼을 초기화 할 것인지

리턴 값은 void 형 포인터입니다. ptr이 그대로 리턴됩니다. 몇 가지 예제를 보면서 어떻게 쓰는지 알아보도록 하겠습니다.


몇 가지 예제들

먼저 1번째 예제입니다.

[그림 2] 예제 1번 프로그램

먼저, int형 배열 p가 있습니다. 이 배열은 100000개의 int 자료를 담을 수 있어요. 1번째 인자는 p로, 배열의 시작 주소에요. 거기서부터, -1이라는 값으로 초기화를 합니다. byte는 얼마만큼? sizeof(int)에 10만을 곱한 것 만큼이요.

즉, 배열 전체를 -1로 초기화 한다는 의미입니다. 다음에 p[1010]의 값을 출력합니다.

[그림 3] 예제 1번 프로그램의 결과

결과를 보니 -1이 나오네요. 모든 원소가 -1로 초기화 되었음을 의미해요.

[그림 4] 예제 2번 프로그램

이제 예제 2번을 보겠습니다. char형 문자를 담을 수 있는 21개짜리 char형 배열을 선언했습니다. ‘-‘로 초기화 하는데요. str의 시작 주소로부터 sizeof(char) x 20바이트만큼 초기화를 시킵니다. 주의해야 할 것은, null 문자입니다. 이것 때문에, sizeof(char) x 21을 3번째 인자로 넣지 않았습니다.

그 다음에 str을 출력합니다.

[그림 5] 예제 2번 프로그램의 결과

결과는 – 20개가 나오게 됩니다. 1번째 예제와 2번째 예제는 sizeof 연산자와 같이 썼음을 볼 수 있어요. 이는

  • 각 자료형의 크기를 구하기 위해 sizeof 연산자를 썼습니다.
  • 한 원소당 차지하는 크기를 안다면 배열의 전체 크기도 구할 수 있기 때문

입니다. memset을 쓸 때 sizeof를 많이 쓰니, 알아두시면 좋겠습니다.


memset은 특정 값만 초기화가 된다고?

그런데, memset은 제약이 하나 있습니다. 아래 프로그램을 보겠습니다.

[그림 6] 예제 3번 프로그램

예제 3번 프로그램을 보면, 2번째 인자로 5를 받았음을 볼 수 있어요. -5가 나올까요?

[그림 7] 예제 3번 프로그램의 결과

84215045가 나옵니다. 어떻게 이런 결과가 나온 것일까요?

[그림 8] 84215045의 2진수 표현

84215045를 2진수로 바꿔 봅시다. 그러면 00000101 00000101 00000101 00000101이 나오게 됩니다. 8을 주기로 같은 패턴이 반복됨을 볼 수 있어요. 즉, memset은 1byte 단위로 초기화를 합니다. 2번째 인자로 5를 넣었을 때, 다음과 같이 초기화가 되게 됩니다.

따라서, -5가 나올 것이란 기대와는 다르게, 84215045라는 뜬금없는 수가 나오게 된 것입니다. 0이나 -1은 초기화가 가능합니다.

1byte의 0은 00000000 입니다. memset의 2번째 인자로 0을 넘겨줬다면 00000000 00000000 00000000 00000000 .. 과 같이 초기화가 될 것입니다. 00000000 00000000 00000000 00000000 또한 0입니다. 이는 0xABABABAB 패턴이기 때문에 가능합니다.

-1은 어떤가요? 1byte의 1은 11111111입니다. memset의 2번째 인자를 -1로 넘겨주었다면, 위 그림과 같이 초기화가 될 것입니다. 11111111 11111111 1111111 11111111 역시 -1입니다. 이는 -1 또한, 0xABABABAB 패턴이기에 가능합니다.

비슷한 이유로 0x3f3f3f3f 또한, 0xABABABAB 패턴에 걸립니다. 따라서, memset으로 초기화 가능합니다. 이렇게 초기화 할 수 있는 수가 제한적이기 때문에, 속 편하게 c++의 fill 등을 사용하는 것이 좋습니다. 해당 함수 사용법은 아래 링크에서 확인할 수 있습니다.

  • c++ fill 함수 사용하는 방법을 알아봅시다. 링크

Leave a Comment

19 − 15 =