C 언어에서 "sizeof("string")"의 정확한 출력값은 무엇일까요?

2024-07-27

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



C++에서의 "Strict Aliasing Rule" 란 무엇일까요?

이 규칙은 다음과 같은 상황에 적용됩니다.서로 다른 기본 유형을 가진 포인터: int* 포인터와 char* 포인터는 서로 다른 유형으로 간주되므로 별칭이 허용되지 않습니다.const 또는 volatile 키워드가 달라지는 포인터: const int* 포인터와 int* 포인터는 서로 다른 유형으로 간주되므로 별칭이 허용되지 않습니다...


C++ 및 C 언어에서 구조체 크기 계산: sizeof 연산자의 비밀

1. 메모리 정렬:컴파일러는 메모리 접근 속도를 최적화하기 위해 데이터를 특정 방식으로 정렬합니다. 이는 구조체 멤버의 배치에도 영향을 미칩니다.예를 들어, 다음 구조체를 살펴보겠습니다.int는 일반적으로 4바이트...


C 언어에서 랜덤 정수 생성하기

C 프로그래밍에서 랜덤 숫자는 다양한 용도로 사용됩니다. 예를 들어,게임: 몬스터 출현 위치, 아이템 드롭 확률 등을 결정하는 데 사용됩니다.시뮬레이션: 실제 현상을 모방하기 위해 무작위한 값을 생성합니다.암호화: 난수를 기반으로 안전한 암호 시스템을 구축합니다...


C/C++에서의 '-->' 연산자는 존재하지 않습니다.

혹시 말씀하시는 연산자가 무엇인지 알 수 있을까요?예를 들어, 다음과 같은 연산자들을 의미하셨을 수도 있습니다:화살표 연산자 (->): 멤버 접근 연산자로, 구조체나 클래스의 멤버에 접근하는 데 사용됩니다. 예를 들어...


C와 C++에서 char를 int로 변환하는 방법에 대한 상세 설명

숫자 문자를 숫자 값으로: '1'과 같은 숫자 문자를 실제 숫자 1로 사용하고 싶을 때ASCII 코드 활용: 문자의 ASCII 코드 값을 이용한 연산이나 비교를 수행할 때다른 데이터 타입과의 연산: char형 변수를 int형 변수와 함께 연산해야 할 때...



c language lawyer sizeof

C/C++ 프로그래밍에서 #include <filename>과 #include "filename"의 차이점

1. #include <filename>각 컴파일러마다 정의된 표준 헤더 파일을 포함하는 데 사용됩니다.<filename> 안에 작성된 파일 이름은 컴파일러가 미리 정의된 경로 목록에서 검색됩니다. 이 목록은 일반적으로 운영 체제 및 컴파일러에 따라 다릅니다


++i와 i++의 차이: C 언어의 전위 증감 연산자와 후위 증감 연산자

C 언어에서 ++i와 i++는 모두 변수 i의 값을 1 증가시키는 증감 연산자입니다. 하지만 언제 값이 증가하는지에 따라 전혀 다른 결과를 가져오기 때문에 명확하게 이해하는 것이 중요합니다.먼저 값을 증가시킨 후 해당 값을 반환합니다


C 언어에서 배열의 크기를 구하는 방법

C 언어에서 배열의 크기를 구하는 가장 일반적인 방법은 sizeof 연산자를 사용하는 것입니다.전체 배열의 크기: sizeof(배열 이름)배열이 차지하는 전체 메모리 크기를 바이트 단위로 반환합니다.배열이 차지하는 전체 메모리 크기를 바이트 단위로 반환합니다


C++/C에서 비트 조작: 특정 비트 설정, 해제, 토글하기

C++와 C 프로그래밍에서 비트 조작은 저수준 시스템 프로그래밍이나 효율적인 알고리즘 구현에 필수적인 기술입니다. 특히, 특정 비트를 설정, 해제, 또는 토글하는 작업은 하드웨어 제어, 데이터 압축, 암호화 등 다양한 분야에서 활용됩니다


C 코드 단위 테스트 개요

코드 오류 감소: 단위 테스트를 통해 코드의 다양한 실행 경로를 테스트하여 예상치 못한 오류를 발견할 수 있습니다.코드 보증: 테스트를 통과하는 코드는 사양을 충족하는 것으로 간주될 수 있습니다.디자인 개선: 테스트를 작성하면서 코드 설계를 다시 생각하게 되고