Posts memset, bzero, memcpy, memccpy
Post
Cancel

memset, bzero, memcpy, memccpy

(1) memset
기본 함수 구조 및 매개변수: void *memset ( void* ptr, int value, size_t num );
return값: ptr

1
2
void\* (보이드포인터): 주소를 담는 자료형이지만 주소연산은 불가능
size_t: 이론상 가장 큰 사이즈를 담을 수 있는 unsigned 데이터 타입. 즉, 32비트 머신에서는 32비트 사이즈의 unsigned 정수형(int가 아니라 그냥 '정수'를 의미), 64비트 머신에서는 64비트 사이즈의 unsigned 정수형(unsigned long long). 향후 등장할지도 모르는 128비트 머신이라던가 더 큰 머신이 존재한다면 그에 따라 더 큰 사이즈가 됨.

memset함수를 사용하면 메모리의 내용을 원하는 크기만큼 특정값으로 설정할 수 있음.
함수 이름은 memory set에서 따왔음.
이 때 설정하는 크기는 바이트 단위.
사용하기 위해서는 string.h 또는 memory.h 헤더 파일을 포함해야 함.
주로 설정할 값을 0으로 지정하여 메모리의 내용을 모두 0으로 만들 때 사용.

1
2
3
4
5
6
7
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 \*)과 같이 포인터의 크기를 지정하면 안됨
포인터의 크기는 메모리의 주소의 크기일 뿐 실제 메모리가 차지하는 크기가 아님

value는 int형이지만 내부에서는 unsigned char (1byte)로 변환되어 저장됨.

(2) bzero
기본 함수 구조 및 매개변수: void bzero(void *ptr, size_t size);
return값: 없음
메모리 공간을 size 바이트만큼 0으로 채움.
즉, ptr 주소값부터 size 바이트만큼 0으로 채움.
bzero()의 기능은 memset으로 가능하며 성능 차이 없음.
C언어 비표준이며 deprecated된 함수이므로 사용 말라고 함.

(3) memcpy
기본 함수 구조 및 매개변수: void *memcpy(void* dest, const void* src, size_t num);
return값: dest
메모리의 일부분을 복사.
src가 가리키는 곳부터 num바이트 만큼을 dest이 가리키는 곳에 복사.
이 때, dest과 src의 타입은 모두 위 함수와 무관.
왜냐하면 이 함수는 단순히 이진 데이터를 복사하는 것이기 때문.
또한, 이 함수는 src의 null을 검사하지 않음. 언제나 정확히 num바이트 만큼 복사.
오버플로우 문제를 방지하기 위해 dest과 src가 가리키는 배열의 크기는 반드시 num바이트 이상이어야 하며, 서로 겹치면 안됨.
(만일 두 메모리 블록이 겹쳐져 있다면 memmove함수를 이용하는 것이 현명)
strcpy()함수와 차이점은 문자열은 문자열의 끝을 null byte로 구분하지만, 메모리는 null byte도 데이터기 때문에 num을 명시적으로 지정해야 함.
문자열(char*)을 전체 복사할 때는 길이 + 1을 해주어야 함. ‘\0’까지 복사하기 위해.

(4) memccpy
기본 함수 구조 및 매개변수: void *memccpy(void *dest, const void *src, int c, size_t n);
return값:

  • dest + 복사된 바이트 수 (dest에 복제가 끝난 데이터의 다음 메모리 번지, 추가 복제를 쉽게 하기 위하여)
  • NULL (src에서 c문자를 만나지 못함.)

src에서 n바이트만큼의 데이터를 dest에 복제할 때에 src에서 문자 c를 만나면 c까지 복제하고 복제를 중단, dest리턴.
그렇지 않은 경우엔 n바이트가 복사되고 NULL 리턴.


etc.
To convert existing indentation from spaces to tabs hit Ctrl+Shift+P and type: Convert indentation to Tabs

This post is licensed under CC BY 4.0 by the author.