C

[C] 메모리 초기화 함수 bzero(), memset()

HHRR 2025. 6. 22. 22:14

 

1. bzero() 란?

bzero함수는 c언어에서 메모리 초기화 함수로 쓰이고, 포인터 s부터 값을 n byte만큼 0으로 초기화 해주는 함수이다. 

(n이 0이면 아무 동작도 안함) 표준 c 라이브러리에 포함되어 있고, 링커에서 -lc로 링크됨.

 

 

2. memset() 란?

 

memset()도 마찬가지로 메모리 초기화 함수인데, bzero()랑 다르게 메모리 블록을 특정 바이트 값으로 채우는 함수이다. 

포인터 b부터 시작해서 len 바이트를 c(int 타입인데 내부적으로 unsigned char로 변환)로 채움

 

3.  주의할 점 

1) bzero() 대신 memset() 쓰기

bzero()는 POSIX 표준에서 deprecated 됨. memset()은 C 표준에 포함되어있고, 성능 측면에서도 컴파일러가 최적화하기 좋음.

왜? ISO C 표준함수에 포함되어있어, 더 좋은 명령어로 바꿀 수 있음.

컴파일러는 memset() 을 내부적으로 __builtin_memset()으로 바꾸는데, 이는 컴파일러가 직접 최적화 가능한 특수 명령임. -> 컴파일러는 함수 호출 없이 rep stosb 같은 빠른 명령어 생성 or SIMD 벡터 명렁올 대체한다. bzero()는 비표준이기 때문에 그냥 함수 호출처럼 취급해서 인라인 처리 불가, 최적화 어렵다.

 

2) memset으로 포인터 초기화 할 때

// 위험한 초기화 방법
memset(&ptr, 0, sizeof(ptr));  // (o)
memset(ptr, 0, sizeof(*ptr));  // (x) 메모리 할당 전에 쓰면 crash

malloc 없이 포인터를 memset() 하면 세그멘테이션 오류가 발생한다.

포인터 변수 자체를 초기화할지, 가리키는 대상 메모리를 초기화할지 구분하자!!

 

예를 들어서

 

(1)

int *ptr;
memset(&ptr, 0, sizeof(ptr));  // (o)

&ptr은 포인터 변수 자체의 주소이다. 주소 자체를 0으로 초기화하는 함수. 이건 ptr 자체를 null로 만들어서 안전하다.

 

(2)

int *ptr;  //  초기화 안 됨
memset(ptr, 0, sizeof(*ptr));  // (x) — segfault 가능

ptr은 가리키는 메모리 주소가 쓰레기값이다. 그 쓰레기 주소에 0을 쓰려고 하므로 segfault 가능.. 매우 위험!!

 

int *ptr = malloc(sizeof(int));  // 1.메모리 먼저 할당
memset(ptr, 0, sizeof(*ptr));    // 2.이제 안전하게 초기화

ptr은 이제 유효한 메모리를 가리킨

*ptr은 그 메모리 공간의 값 (int 4바이트)를 의미하므로, memset()은 ptr이 가리키는 곳에 안전하게 접근 가능

 

 

 

 

'C' 카테고리의 다른 글

[C] 메모리 관리 원칙  (5) 2025.07.12
[C] 동적 메모리 할당이란? (Dynamic Memory Allocation)  (2) 2025.07.12
[C] 구조체 주소체계  (3) 2025.07.06
[C] 예외처리, 오류처리  (7) 2025.06.29
[C] 헷갈리는 연산자 우선순위  (6) 2025.06.24