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

C 언어에서 strlen()과 sizeof()의 차이점 완벽 정리

C 프로그래밍에서 문자열(string)은 여러 개의 문자(character)가 모여 이루어진 자료 구조로 정의할 수 있습니다. 그렇다면 하나의 문자열이 실제로 몇 글자로 구성되어 있는지 확인하려면 어떻게 해야 할까요? C 언어는 이러한 요구를 충족하기 위해 두 가지 방법을 제공하는데, 바로 strlen()sizeof()입니다.

strlen()과 sizeof(), 무엇이 다를까?

두 방법 모두 대상 피연산자의 크기나 길이를 구하는 데 사용된다는 공통점이 있지만, 내부적인 동작 방식과 구현 원리가 다르기 때문에 결과값에도 중요한 차이가 발생합니다. 아래 표를 통해 두 가지 방법의 핵심적인 차이점을 비교해 보겠습니다.

번호구분strlen()sizeof()
1정의strlen()은 C 언어의 헤더 파일인 string.h에 미리 정의되어 있는 라이브러리 함수입니다.sizeof()는 함수가 아니라 단항 연산자(unary operator)입니다.
2동작 방식문자열을 구성하는 문자의 개수를 세며, 이때 널(null) 문자는 제외합니다. 즉, 널 종단 문자열(null-terminated string)의 실제 길이를 반환합니다.변수나 데이터 타입이 실제로 차지하는 메모리 크기를 바이트 단위로 계산하며, 널 문자까지 포함한 전체 크기를 반환합니다.
3널 문자 처리널 문자('\0')를 길이 계산에서 제외합니다.변수에 저장된 값과 상관없이 할당된 데이터 타입의 실제 크기를 바이트 단위로 계산하므로, 널 문자도 크기에 포함됩니다.

예제 코드로 이해하기

실제 코드를 통해 두 연산의 차이를 더 명확하게 확인할 수 있습니다.

#include <stdio.h>
#include <string.h>

int main(void) {
    char str[] = "Hello";

    printf("strlen(str) = %zu\n", strlen(str));   // 출력: 5
    printf("sizeof(str) = %zu\n", sizeof(str));   // 출력: 6

    return 0;
}

위 예제에서 str은 'H', 'e', 'l', 'l', 'o' 다섯 글자와 문자열 끝을 나타내는 널 문자('\0')까지 총 6바이트의 메모리를 차지합니다. 따라서 널 문자를 제외한 strlen()의 결과는 5이고, 널 문자를 포함한 실제 메모리 크기를 반환하는 sizeof()의 결과는 6입니다.

정리

  • strlen(): 문자열의 논리적 길이(널 문자 제외)를 알고 싶을 때 사용합니다. 런타임에 문자열을 처음부터 끝까지 순회하며 길이를 계산합니다.
  • sizeof(): 변수나 타입이 차지하는 실제 메모리 크기(널 문자 포함)를 알고 싶을 때 사용합니다. 컴파일 시점에 크기가 결정되므로 실행 속도에 영향을 주지 않습니다.

두 가지의 동작 원리를 정확히 이해하고 있으면, 버퍼 크기 계산이나 문자열 처리 로직 작성 시 발생할 수 있는 off-by-one 오류 같은 실수를 예방할 수 있습니다.