35.2 메모리 내용 한꺼번에 설정하기
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
Author And Source
이 문제에 관하여(35.2 메모리 내용 한꺼번에 설정하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@shuajjjjj/35.2-메모리-내용-한꺼번에-설정하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)