>  기사  >  백엔드 개발  >  C에서 `strlen`과 `sizeof`가 포인터 및 배열 기반 문자열 초기화에 대해 서로 다른 값을 반환하는 이유는 무엇입니까?

C에서 `strlen`과 `sizeof`가 포인터 및 배열 기반 문자열 초기화에 대해 서로 다른 값을 반환하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-01 07:14:02617검색

Why do `strlen` and `sizeof` return different values for pointer and array-based string initialization in C?

포인터 및 배열 기반 문자열 초기화에 대한 strlen 및 sizeof와 다른 답변 [중복]

C 프로그래밍 언어에서 배열과 문자열에 대한 포인터인 경우 'strlen' 및 'sizeof' 함수를 사용하여 다양한 출력을 얻을 수 있습니다. 효과적인 메모리 관리 및 데이터 처리를 위해서는 이러한 불일치를 이해하는 것이 중요합니다.

이 차이점을 설명하기 위해 다음 코드 조각을 고려하세요.

char *str1 = "Sanjeev";
char str2[] = "Sanjeev";
printf("%d %d\n",strlen(str1),sizeof(str1));    
printf("%d %d\n",strlen(str2),sizeof(str2));

생성되는 출력은 다음과 같습니다.

7 4
7 8

'strlen' 함수는 문자열에서 null 종결자를 제외한 문자 수를 반환합니다. 두 경우 모두 문자열에는 7자가 포함됩니다. 반면 'sizeof' 함수는 메모리에 있는 데이터 유형의 크기를 반환합니다.

포인터 'str1'의 경우 'sizeof(str1)'은 포인터 변수 자체의 크기를 반환하며, 이는 대부분의 시스템에서 일반적으로 4바이트입니다. 'str1'은 배열이 아니라 단지 문자열 "Sanjeev"에 대한 포인터이기 때문입니다.

반면 'str2'는 문자 배열입니다. 'sizeof(str2)'는 null 종결자를 포함하여 전체 배열의 크기를 반환합니다. 결과적으로 8바이트를 출력합니다. 즉, 문자에 7바이트, null 종결자에 1바이트입니다.

이 개념을 더 자세히 이해하려면 다음 수정된 코드를 고려하세요.

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));

이것은 시간이 지나면 출력은 다음과 같습니다.

7 4
7 8

'str1'과 'str2'가 동일한 문자열을 참조하더라도 'sizeof' 출력은 동일하게 유지됩니다. 이는 'str1'이 여전히 포인터이고 'str2'가 배열로 남아 있기 때문입니다. 'strlen' 출력은 문자열의 문자만 계산하므로 둘 다 7로 유지됩니다.

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

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