>  기사  >  백엔드 개발  >  C에서 포인터와 배열 문자열 초기화에 대해 `strlen`과 `sizeof`가 다른 결과를 제공하는 이유는 무엇입니까?

C에서 포인터와 배열 문자열 초기화에 대해 `strlen`과 `sizeof`가 다른 결과를 제공하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-01 00:42:28166검색

Why do `strlen` and `sizeof` give different results for pointer and array string initialization in C?

포인터와 배열 문자열 초기화: strlen 및 sizeof의 불일치

C 프로그래밍에서 포인터와 배열을 사용하여 문자열을 초기화하면 예기치 않은 불일치가 발생할 수 있습니다. strlen 및 sizeof의 출력. 구체적인 예를 검토하여 이 현상을 분석해 보겠습니다.

제공된 코드 조각:

<code class="c">char *str1 = "Sanjeev";
char str2[] = "Sanjeev";
printf("%d %d\n", strlen(str1), sizeof(str1));
printf("%d %d\n", strlen(str2), sizeof(str2));</code>

다음 출력을 생성합니다.

7 4
7 8

변형은 다음으로 인해 발생합니다. 데이터 유형과 객체 크기에 있어서 포인터와 배열의 근본적인 차이점이 있습니다.

포인터(str1)

  • strlen(str1)은 7을 반환합니다. str1이 가리키는 문자열(널 종결자 제외).
  • sizeof(str1)은 str1이 4바이트 메모리 주소(32비트 시스템)를 가진 포인터 변수이기 때문에 4를 반환합니다.

Array (str2)

  • strlen(str2)도 배열의 문자열 길이를 고려하여 7을 반환합니다.
  • sizeof( str2)는 str2가 null 종결자를 포함하여 8개의 문자를 포함하는 배열이기 때문에 8을 반환합니다.

이러한 개념을 더 자세히 설명하기 위해 코드를 약간 수정해 보겠습니다.

<code class="c">char str2[8];
strncpy(str2, "Sanjeev", 7);
char *str1 = str2;
printf("%d %d\n", strlen(str1), sizeof(str1));
printf("%d %d\n", strlen(str2), sizeof(str2));</code>

이 코드 strlen: 7 측면에서 str1과 str2 모두에 대해 동일한 결과를 생성합니다. 그러나 sizeof(str1)은 메모리 주소를 나타내는 4로 유지되는 반면 sizeof(str2)는 8로 조정되어 여전히 null 종료 문자를 고려합니다.

따라서 C 프로그래밍에서 문자열을 사용할 때 포인터와 배열의 고유한 데이터 유형과 크기 특성을 이해하는 것이 핵심입니다.

위 내용은 C에서 포인터와 배열 문자열 초기화에 대해 `strlen`과 `sizeof`가 다른 결과를 제공하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.