C 언어에서 "sizeof("string")"의 정확한 출력값은 무엇일까요?
sizeof("string")의 의미
sizeof("string")
은 문자열 리터럴 "string"의 크기를 나타냅니다. 여기서 주의해야 할 점은 문자열 리터럴은 null 문자('\0')를 포함하여 저장된다는 것입니다. 따라서 "string" 문자열의 크기는 7개의 문자 + null 문자 1개 = 8바이트입니다.
예시 코드
#include <stdio.h>
int main() {
printf("sizeof(\"string\"): %d\n", sizeof("string"));
return 0;
}
위 코드를 실행하면 다음과 같은 출력값이 나타납니다.
sizeof("string"): 8
추가 고려 사항
- 문자 배열 vs. 문자열 리터럴:
char str[] = "string";
와 같이 문자 배열을 선언하는 경우, sizeof(str)
은 문자 배열 자체의 크기를 반환합니다. 즉, 문자열 리터럴의 길이 + 1 (null 문자) + 문자 배열의 끝을 나타내는 null 문자 1개를 포함합니다. 예를 들어, 위 코드를 다음과 같이 변경하면:
char str[] = "string";
int main() {
printf("sizeof(str): %d\n", sizeof(str));
return 0;
}
출력값은 다음과 같이 9가 됩니다.
sizeof(str): 9
- 포인터 vs. 배열:
char *str = "string";
와 같이 문자열 리터럴을 가리키는 포인터를 선언하는 경우, sizeof(str)
은 포인터 자체의 크기를 반환합니다. 일반적으로 32비트 시스템에서는 4바이트, 64비트 시스템에서는 8바이트입니다.
따라서 sizeof
연산자를 사용하여 문자열의 크기를 계산하려는 경우, 사용하는 상황에 따라 다르다는 것을 기억해야 합니다.
참고 자료
예제 코드
#include <stdio.h>
int main() {
// 문자열 리터럴
printf("sizeof(\"string\"): %d\n", sizeof("string")); // 8
// 문자 배열
char str1[] = "string";
printf("sizeof(str1): %d\n", sizeof(str1)); // 9
// 문자열 리터럴을 가리키는 포인터
char *str2 = "string";
printf("sizeof(str2): %d\n", sizeof(str2)); // 4 (32비트 시스템) 또는 8 (64비트 시스템)
return 0;
}
sizeof("string"): 8
sizeof(str1): 9
sizeof(str2): 4 (32비트 시스템) 또는 8 (64비트 시스템)
설명:
sizeof("string")
: 문자열 리터럴 "string"의 크기는 8바이트입니다.sizeof(str1)
: 문자 배열str1
은 문자열 "string"과 null 문자를 포함하여 9바이트입니다.sizeof(str2)
: 문자열 리터럴을 가리키는 포인터str2
는 포인터 자체의 크기만 반환합니다. 32비트 시스템에서는 4바이트, 64비트 시스템에서는 8바이트입니다.
sizeof
사용 외에 문자열 길이를 계산하는 방법
strlen 함수 사용:
string.h
헤더 파일에 정의된 strlen
함수는 문자열의 길이를 계산하는 함수입니다. strlen
함수는 문자열의 시작 주소를 인수로 받아 null 문자('\0')를 만날 때까지 문자의 개수를 계산합니다.
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "string";
int len = strlen(str);
printf("문자열 길이: %d\n", len);
return 0;
}
for 루프 사용:
for 루프를 사용하여 문자열을 순회하며 null 문자를 만날 때까지 문자의 개수를 계산하는 방법도 있습니다.
#include <stdio.h>
int main() {
char str[] = "string";
int len = 0;
while (str[len] != '\0') {
len++;
}
printf("문자열 길이: %d\n", len);
return 0;
}
포인터 연산 사용:
포인터 연산을 사용하여 문자열의 시작 주소와 끝 주소의 차이를 계산하여 문자열 길이를 구할 수 있습니다.
#include <stdio.h>
int main() {
char str[] = "string";
char *start = str;
char *end = str;
while (*end != '\0') {
end++;
}
int len = end - start;
printf("문자열 길이: %d\n", len);
return 0;
}
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "string";
int len = strnlen(str, 5);
printf("문자열 길이 (최대 5): %d\n", len);
return 0;
}
std::string 클래스 사용 (C++):
C++에서는 std::string
클래스를 사용하여 문자열을 다룰 수 있습니다. std::string
클래스는 length()
메서드를 제공하여 문자열 길이를 쉽게 얻을 수 있습니다.
#include <iostream>
#include <string>
int main() {
std::string str = "string";
int len = str.length();
std::cout << "문자열 길이: " << len << std::endl;
return 0;
}
각 방법의 장단점:
sizeof
: 간단하지만, 문자 배열의 경우 null 문자를 포함한 크기를 반환합니다.strlen
: 표준 함수이며, 문자열 길이를 정확하게 계산합니다.for 루프
: 간단하지만, null 문자를 직접 확인해야 합니다.포인터 연산
: 다소 복잡하지만, 널 문자를 포함하지 않은 문자열 길이를 계산할 수 있습니다.strnlen
: 최대 길이를 지정하여 문자열 길이를 계산할 수 있습니다.std::string
: C++에서만 사용 가능하며, 객체 지향적인 방식으로 문자열을 다룰 수 있습니다.
c language-lawyer sizeof