C언어의 메모리 관련 함수는 memset, memcpy, memmove 기타 등등 꽤 있는 것 같습니다.
'mem' 은 memory에 관련된 함수라는 것을 의미하고, C언어의 내장 함수에서 접근할 수 있습니다.
요런 메모리 블럭을 조작하는 함수는 String.h라는 헤더 파일에서 참조할 수 있습니다.
memset은 세개의 인수를 받고, 다음과 같습니다.
void* memset(void* ptr, int value, size_t num);
(자세한 설명은 모두의코드(memset설명) 를 참고하시기 바랍니다. )
요컨대 포인터 변수를 이용해서 해당 주소가 가리키는 값을 사용자가 원하는 값으로 변경할 수 있습니다..
그래서 의미는 알겠는데 어떤 경우에 이걸 사용하나? 감이 잘 오지 않았습니다.
그러던 참에, 회사에서 프로그램 소스코드를 휘리릭 돌려보는데 마침 memset함수가 많이 있었더랩니다.
별거 없었습니다. 다음과 같은 흐름 중 사용되었습니다.
1. 문자열 변수를 선언하고,
2. 특정 변수를 담고 있는 파일(텍스트 형식)을 읽은 다음,
3. 조건에 따라 필요한 정보를 필터링한 후 선언한 문자열 변수에 집어넣습니다.
처음 문자열 변수를 선언 후 초기화하지 않으면, 각 인덱스 별 데이터가 쓰레기 값으로 채워집니다.
각 인덱스 값을 널 문자 '\0'로 초기화하기 위해 memset을 이용했습니다.
이렇게 함으로써, 메모리 조작을 보수적이면서도? 메모리 관리를 엄격하게 하는 코드 작성이 되지 않을까 하는 생각이 들었습니다.
개인적으로는 굳이 이런 작업을 안 해줘도, 문자열을 복사하는 작업은 할 수 있다고 생각되지만, 프로그램이 규모가 커지거나 여러 사람들이 작업하는 경우, 관례적으로 어느 정도 보수적으로 규칙을 정해서 진행하는 게 아닌가? 하는 느낌을 받았습니다.
그럼 코드로 내용을 이해해보겠습니다.
(디버깅은 Xcode에서 실행 내용입니다.)
#include <stdio.h>
#include <string.h>
int main(){
int i=0;
char name[5];
printf("%s \n", name);
// name 변수의 5자리를 널문자로 초기화
for(i=0 ; i<sizeof(name); i++){
memset(&name[i], '\0', sizeof(char));
}
// 쓰레기 값 제거 후 변수내용을 화면 출력
printf("%s \n", name);
// name 변수에 문자열 복사
strcpy(name, "Tom");
printf("%s \n", name);
return 0;
}
name이라는 문자열 타입의 변수를 선언하고, memset으로 널문자 처리 전/후 출력내용을 확인합니다.

✅ 출력내용 설명
\357\357 : name변수 선언 후 아무 값도 안 넣었더니, 의도하지 않은 쓰레기 값이 출력됨.
(빈칸) : 널 문자 처리(for loop 사용) 후 name변수는 텅텅 빈 준비된 상태다.
Tom : strcpy로 문자열 변수에 'Tom'이라는 문자열을 복사 후, 정상적으로 출력되는 것을 확인
Xcode의 디버깅 툴을 이용해서, 문자열 변수의 위치별 데이터를 확인.
(디버깅 중 화면, 그림 좌측 하단)
🔗 1️⃣ 초기 변수 선언 후 0,1,2 인덱스 위치에 쓰레기 값이 채워져 있다.

🔗 2️⃣ name 변수에 대해서, for loop 널(Null) 문자처리 코드를 작성했다. 최종 name변수의 각 인덱스 위치는 '\0'로 채워졌다.

🔗 3️⃣ name변수가 깨끗하게 초기화됐으므로, name변수를 문자열 'Tom'으로 복사 후, 디버깅 화면에서도 'Tom'이 잘 입력된 지 확인한다.

이상, memset함수의 사용 후기였습니다.
'[ STUDY ]' 카테고리의 다른 글
[ C 언어 ] 실무에서 막혔던 문자열 관련 유용한 내용.(함수만들기) (0) | 2021.04.04 |
---|---|
[ 머신 비전 ] 채용 공고로 공부 방향 계획하기. 수아랩.코그넥스코리아 (0) | 2021.03.13 |
[ 환경설정 ] Visual Studio Code 에서 C++ 컴파일 디버그 환경 설정 방법(맥 버전.) (3) | 2021.03.02 |
[ 머신 비전 ] 채용 공고로 공부 방향 계획하기. 카카오 모빌리티. (0) | 2021.02.25 |
JAVASCRIPT관련 각종 모듈 설치,설정 메모 (0) | 2020.01.09 |