내맘대로 공부기록.

[ STUDY ]

[ C 언어 ] 실무에서 보고느낀 memset 함수 사용후기.

fwanggus 2020. 11. 22. 20:53

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함수의 사용 후기였습니다.

반응형