35.2 메모리 내용 한꺼번에 설정하기

7428 단어 CC

memset 함수

  • memset 함수를 사용하면 메모리의 내용을 원하는 크기만큼 특정값으로 설정할 수 있다.
  • memory set에서 따왔다.
  • sting.h 헤더 파일에 선언되어 있다.
  • 설정하는 크기는 바이트 단위이다.

⭐ memset 함수

  • memset(포인터, 설정할 값, 크기);
    • void memset(void_Dst, int_Val, size_t_Size);
    • 값 설정이 끝난 포인터를 반환
#include <stdio.h>
#include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일
#include <string.h>    // memset 함수가 선언된 헤더 파일

int main()
{
    long long *numPtr = malloc(sizeof(long long));  // long long의 크기 8바이트만큼 동적 메모리 할당

    memset(numPtr, 0x27, 8);    // numPtr이 가리키는 메모리를 8바이트만큼 0x27로 설정

    printf("0x%llx\n", *numPtr);    // 0x2727272727272727: 27이 8개 들어가 있음

    free(numPtr);    // 동적으로 할당한 메모리 해제

    return 0;
}
  • memset(numPtr, 0x27, 8);과 같이 사용했으므로 numPtr이 가리키는 메모리에는 16진수 27이 8개 들어가게 된다.
  • memset 함수는 주로 설정할 값을 0으로 지정하여 메모리 내용을 모두 0으로 만들 때 주로 사용한다.
	memset(numPtr, 0, 8);    // numPtr이 가리키는 메모리를 8바이트만큼 0으로 설정

💡 참고) 자료형의 크기와 포인터 크기

memset 함수에 설정할 크기글 지정할 때 보통 숫자 대신 sizeof를 사용한다.

long long *numPtr = malloc(sizeof(long long));
memset(numPtr, 0, sizeof(long long));
// numPtr이 가리키는 메모리를 long long 크기만큼 0으로 설정
  • 여기서 메모리를 sizeof(long long)크기만큼 할당했으므로 설정할 크기도 sizeof(long long)과 같이 지정해야 한다.
  • sizeof(long long *)과 같이 포인터의 크기를 지정하면 안 된다.❗❗ 포인터의 크기는 메모리 주소의 크기일 뿐 실**제 메모리가 차지하는 크기가 아니다.



  • 이 부분은 char 포인터에 메모리를 할당해보면 잘 알 수 있다.
    char *cPtr = malloc(sizeof(char));    // char의 크기 1바이트만큼 동적 메모리 할당
memset(cPtr, 0, sizeof(char));    // char의 크기 1바이트만큼 0으로 설정(올바른 방법)
memset(cPtr, 0, sizeof(char *));  // 32비트: char 포인터의 크기 4바이트만큼 0으로 설정(잘못된 방법)
                                  // 64비트: char 포인터의 크기 8바이트만큼 0으로 설정(잘못된 방법)
free(cPtr);

⇨ memset(numPtr, 0, sizeof(char));는 메모리를 1바이트만큼 0으로 설정하니 문제가 없다.
⇨ 하지만 memset(numPtr, 0, sizeof(char *));는 32비트에서 4바이트, 64비트에서 8바이트만큼 0으로 설정하므로 할당받은 메모리 크기를 넘어서게 된다.



출처

https://dojang.io/mod/page/view.php?id=287

좋은 웹페이지 즐겨찾기