Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 메모리 연산 함수 완벽 가이드: memchr부터 memset까지

C 언어에서 메모리를 직접 다루는 기본적인 연산 함수들은 #include <memory.h> 헤더에 정의되어 있습니다. 흥미로운 점은 이 함수들이 엄밀히 말해 문자열 함수는 아니지만, 관례상 #include <string.h> 헤더에 함수 원형이 선언되어 있다는 것입니다.

주요 메모리 연산 함수 목록

C 언어가 제공하는 대표적인 메모리 연산 함수는 다음과 같습니다.

void *memchr(const void *s, int c, size_t n);버퍼 내에서 특정 문자를 검색합니다.
int memcmp(const void *s1, const void *s2, size_t n);두 개의 버퍼를 비교합니다.
void *memcpy(void *dest, const void *src, size_t n);한 버퍼의 내용을 다른 버퍼로 복사합니다.
void *memmove(void *dest, const void *src, size_t n);한 버퍼에서 다른 버퍼로 지정된 바이트 수만큼 데이터를 이동합니다.
void *memset(void *s, int c, size_t n);버퍼의 모든 바이트를 지정한 값으로 설정합니다.

바이트 단위 복사와 sizeof() 활용

위 함수들은 모두 바이트(byte) 단위로 메모리를 처리한다는 점에 유의해야 합니다. 따라서 자료형의 크기에 맞춰 복사할 크기를 지정해야 하며, 이때 sizeof() 연산자가 매우 유용하게 사용됩니다.

memcpy(dest, src, SIZE);문자(char) 배열, 즉 바이트 단위 복사
memcpy(idest, isrc, SIZE * sizeof(int));int 배열 전체 복사

int형은 일반적으로 4바이트이므로, 배열 전체를 복사하려면 요소 개수에 sizeof(int)를 곱한 값을 크기로 전달해야 합니다.

memmove()와 memcpy()의 차이점

memmove()memcpy()와 거의 동일하게 동작하지만, 한 가지 중요한 차이가 있습니다. 원본(src)과 대상(dest)의 메모리 영역이 서로 겹치는 경우에도 안전하게 동작한다는 점입니다. 반면 memcpy()는 메모리 영역이 겹칠 때 정의되지 않은 동작(undefined behavior)을 일으킬 수 있으므로, 겹침 가능성이 있다면 반드시 memmove()를 사용하는 것이 좋습니다.

memcmp()와 strcmp()의 차이점

memcmp()strcmp()와 유사하지만, 문자열 종료 문자('\0')를 고려하지 않고 부호 없는 바이트(unsigned char) 단위로 순수하게 메모리를 비교합니다. 반환 값은 s1이 s2보다 작으면 0보다 작은 값, 같으면 0, 크면 0보다 큰 값입니다.

예제 코드

다음은 메모리 연산 함수에 사용할 수 있는 기본적인 버퍼 선언 예시입니다.

char src[SIZE], dest[SIZE];
int isrc[SIZE], idest[SIZE];

문자 배열은 그대로 크기를 전달하면 되고, int 배열처럼 2바이트 이상의 자료형을 다룰 때는 반드시 sizeof()를 곱하여 올바른 바이트 크기를 지정해야 합니다.