먼저 strlen은 문자열의 길이를 구하는 함수이다. 이 때 null 문자인 '\0'은 포함하지 않는다. strlen 함수는 string.h 헤더에 선언되어있다.


반면 sizeof는 연산자로 피연산자의 메모리 크기를 바이트 단위로 계산한다. 상수, 변수 뿐만 아니라 자료형 그 자체가 피연산자가 될 수 있다. 연산자이기 때문에 상수나 변수의 경우 반드시 괄호를 사용해 묶을 필요는 없다. (자료형의 크기를 구할 때는 괄호를 사용하여야 한다.) 하지만 sizeof는 높은 연산자 우선순위를 가지고 있기 때문에 피연산자가 단항이 아니라면 일반적으로 괄호로 묶어준다. 또한 size는 컴파일타임 연산자이기 때문에 sizeof와 피연산자는 컴파일 단계에서 결과 값을 가진다. (정수 a가 있을 때 sizeof ++a 나 sizeof a++은 a의 값을 변화시키지 않는다.)


예제를 통해 살펴보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main() 
{
 char *str1 = "MoscowMule";
 char str2[20= "MoscowMule";
 char *str3 = (char *)malloc(sizeof(char* 20);
 str3 = "MoscowMule";
 
 printf("sizeof(str1): %d\n"sizeof(str1));
 printf("sizeof(str2): %d\n"sizeof(str2));
 printf("sizeof(str3): %d\n"sizeof(str3));
 
 printf("strlen(str1): %d\n", strlen(str1));
 printf("strlen(str2): %d\n", strlen(str2));
 printf("strlen(str3): %d\n", strlen(str3));
 
 printf("printf(str1): %s\n", str1);
 printf("printf(str2): %s\n", str2);
 printf("printf(str3): %s\n", str3);
 
 return 0;
}
cs


위 코드를 실행 시키면 아래와 같은 출력이 나온다


sizeof(str1): 4
sizeof(str2): 20
sizeof(str3): 4
strlen(str1): 10
strlen(str2): 10
strlen(str3): 10
printf(str1): MoscowMule
printf(str2): MoscowMule
printf(str3): MoscowMule
cs


sizeof 부터 살펴보자.

  • str1은 포인터 변수이기 때문에 32비트 시스템에서는 4바이트(32비트), 64비트 시스템에서는 8바이트(64비트)의 크기를 갖는다. 포인터는 메모리 위치를 가리키는 주소를 담고 있는데, 시스템 마다 지원하는 주소의 비트수가 다르고 결국 포인터 크기도 달라지는 것이다. 여기에서는 32비트로 컴파일 하였기 때문에 4바이트라는 결과가 나왔다.
  • str2은 문자열인데 자료형 char은 각각 1바이트이므로 20바이트의 크기를 가진다. 만약 char str2[] = "MoscowMule"; 라고 하였으면 null 문자까지 포함해 11바이트가 되었을 것이다.
  • str3 역시 str1과 같은 포인터 변수이기 때문에 동일하게 크기는 4바이트이다.

다음은 strlen과 printf 이다.

결국 세 변수 (str1, str2, str3)은 모두 "MoscowMule"이라는 같은 문자열이다.

따라서 strlen을 사용하면 null 문자를 제외한 길이인 10이 나오게 되고, printf를 사용하면 그대로 출력이 된다.



틀린 내용이나, 수정해야할 부분이 있다면 댓글로 남겨주십시오.

바로 조치하겠습니다. 감사합니다.

+ Recent posts