C 언어 에서 sizeof()와 strlen()의 차이 에 대한 상세 한 설명

머리말
sizeof()와 strlen()은 초보 자 들 에 게 자주 헷 갈 리 지만 그 중에서 큰 차이 가 있다.
sizeof()
1.sizeof()[조작 수가 차지 하 는 공간의 바이트 크기]는 c 의 기본 연산 자 입 니 다.
유형,포인터,배열,함수 등 을 매개 변수 로 할 수 있 습 니 다.
헤더 파일 형식 은 unsigned int 입 니 다.
연산 값 은 컴 파일 할 때 결과 가 나 오기 때문에 배열 의 위 수 를 정의 할 수 있 습 니 다.

char a[5]="123";
int b=sizeof(a);//b=5
int c=strlen(a);//c=3

sizeof()는 단일 항목 연산 자 입 니 다.사용 하 는 작업 수가 차지 하 는 공간 바이트 크기 를 계산 하 는 데 사 용 됩 니 다.
strlen
2.strlen()[문자열 의 길 이 를 계산 합 니 다]는 함수 입 니 다.
'\0'을 종지부 로 합 니 다.
strlen 의 결과 가 실 행 될 때 만 나 옵 니 다.(컴 파일 기간 이 아 닌)문자열 의 길 이 를 계산 합 니 다.
그 매개 변 수 는 문자 포인터(char*)여야 합 니 다.
헤더 파일 은\#include입 니 다.

size_t strlen(const char *str)//size_t()

다음은 구체 적 인 실례(vs 2013 은 32 비트 로 설정)입 니 다.

int main()
{
	char *p = "hello";
	char arr1 []= "hello";
	char arr2[] = { 'h', 'e', 'l', 'l', 'o' };
	printf("%d
", sizeof( p)); // 4, 32-4,64-8 printf("%d
", sizeof(arr1)); // 6, \0 ,sizeof() \0 printf("%d
", sizeof(arr2)); // 5, , \0( \0) printf("%d
", strlen( p)); // 5,strlen , \0 printf("%d
", strlen(arr1)); // 5,strlen , \0 printf("%d
", strlen(arr2)); // \0, \0 , 'o' \0,
程序运行结果如上
결 과 는 위 와 같다.

32 비트 운영 체제 로 설정
다음 주의사항:

#include <stdio.h>
int main()
{
 int arr[] = {1,2,(3,4),5};//    
 printf("%d
", sizeof(arr)); return 0; }

배열 의 데이터 형식 에 주의 하 십시오.char 는 하나의 바이트 만 차지 하고 int 데이터 형식 은 네 개의 바이트 입 니 다.*4 를 잊 지 마 세 요.앞의 예 는 char 의 것 이다.

#include <stdio.h>
int main()
{
 char arr[] = {1,2,(3,4),5};//   
 printf("%d
", sizeof(arr)); return 0; }

대량의 사례(깊이 알 고 싶 으 면 볼 수 있다)
2020 년 11 월 19 일 보충:
몇 가지 문 제 를 보충 하 다.
1.(괄호 int 의 size of())

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int arr[] = { 1, 2, 3, 4 };
	printf("%d
", sizeof(arr)); // 16 printf("%d
", sizeof(arr + 0)); // 4 sizeof(int*) printf("%d
", sizeof(*arr)); // 4, sizeof(int) printf("%d
", sizeof(arr + 1)); // 4, sizeof(int*) printf("%d
", sizeof(arr[1])); // 4, sizeof(int) printf("%d
", sizeof(&arr));// 4, sizeof(int(*)[4]); printf("%d
", sizeof(*&arr));// 16, sizeof(int[4]); printf("%d
", sizeof(&*arr));// 4, sizeof(int*) printf("%d
", sizeof(&arr + 1)); // 4, sizeof(int(*)[4]) printf("%d
", sizeof(&arr[0])); // 4, sizeof(int*) printf("%d
", sizeof(&arr[0] + 1)); // 4, sizeof(int*) system("pause"); return 0; }
괄호 정 의 는'\0'이 없 기 때문에 strlen 을 구 하 는 것 은 정의 되 지 않 은 행위 이기 때문에 size of()만 있 습 니 다.
2.(괄호 char 의 sizeof())

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
	printf("%d
", sizeof(arr)); // 6, sizeof(char[6]) printf("%d
", sizeof(arr + 0)); // 4, sizeof(char*) printf("%d
", sizeof(*arr)); // 1, sizeof(char) printf("%d
", sizeof(arr + 1)); // 4 printf("%d
", sizeof(arr[1]));// 1, sizeof(char) printf("%d
", sizeof(&arr));// 4, sizeof(char(*)[6]) printf("%d
", sizeof(*&arr)); // 6, sizeof(char[6]) printf("%d
", sizeof(&*arr));// 4, sizeof(char*) printf("%d
", sizeof(&arr[1] + 1)); // 4, sizeof(char*) printf("%d
", sizeof(&arr + 1)); // 4, sizeof(char(*)[6]); system("pause"); return 0; }
괄호 정 의 는'\0'이 없 기 때문에 strlen 을 구 하 는 것 은 정의 되 지 않 은 행위 이기 때문에 size of()만 있 습 니 다.
3.(문자열 char 의 sizeof()와 strlen)

char arr[] = "abcdef";
	printf("%d
", sizeof(arr)); // 7, sizeof(char[7]); printf("%d
", sizeof(arr + 0)); // 4, sizeof(char*) printf("%d
", sizeof(*arr)); // 1, sizeof(char) printf("%d
", sizeof(arr[1])); // 1, sizeof(char) printf("%d
", sizeof(&arr[0] + 1)); // 4, sizeof(char*) printf("%d
", sizeof(&arr)); // 4 sizeof(char(*)[7]) printf("%d
", sizeof(*&arr)); // 7 sizeof(char[7]) printf("%d
", sizeof(&*arr)); // 4 sizeof(char*) printf("%d
", sizeof(&arr + 1)); // 4 sizeof(char(*)[7]) printf("%d
", strlen(arr)); // 6 printf("%d
", strlen(arr + 1)); // 5 printf("%d
", strlen(&arr + 1)); // printf("%d
", strlen(&arr)); // printf("%d
", strlen(&arr[0])); // 6 printf("%d
", strlen(*&arr)); // 6 printf("%d
", strlen(&*arr)); // 6 printf("%d
", strlen(&arr[1] + 1));//4
strlen 에서 형식 이 일치 하지 않 는 것 은 그들의 데이터 형식 이 char*가 아니 기 때 문 입 니 다.
4.(포인터 가 정의 하 는 sizeof()와 strlen)
이 예 제 는 사실 약간 편 제 된 것 이다.지침 과 배열 의 암시 적 전환 과 관련된다.

char* p = "abcdef";

	printf("%d
", sizeof(p)); // 4 sizeof(char*) printf("%d
", sizeof(p + 1)); // 4 sizeof(char*) printf("%d
", sizeof(*p)); // 1 sizeof(char) printf("%d
", sizeof(p[0])); // 1 sizeof(char) printf("%d
", sizeof(&p)); // 4 sizeof(char**) printf("%d
", sizeof(&p[1] + 1)); // 4 sizeof(char*) printf("%d
", sizeof(*&p)); // 4 sizeof(char*) printf("%d
", sizeof(&*p)); // 4 sizeof(char*) printf("%d
", strlen(p)); // 6 printf("%d
", strlen(p + 1)); // 5 printf("%d
", strlen(*p)); // printf("%d
", strlen(p[1])); // printf("%d
", strlen(&p)); // . printf("%d
", strlen(&p[1] + 1)); // 4 printf("%d
", strlen(*&p)); // 6 printf("%d
", strlen(&*p)); // 6
strlen 에서 형식 이 일치 하지 않 는 것 은 그들의 데이터 형식 이 char*가 아니 기 때 문 입 니 다.
5.(괄호 2 차원 배열 int 의 size of())

int arr[3][4] = { 0 };
	printf("%d
", sizeof(arr)); // 48 sizeof(int[3][4]) printf("%d
", sizeof(arr[0])); // 16 sizeof(int[4]) // arr[0] int[4], + 1, int[4] int* printf("%d
", sizeof(arr[0] + 1)); // 4 sizeof(int*) printf("%d
", sizeof(&arr[0] + 1)); // 4 sizeof(int(*)[4]) printf("%d
", sizeof(arr[0][0])); // 4 sizeof(int) printf("%d
", sizeof(*arr[0])); // 4, sizeof(int) // arr int[3][4] => int(*)[4] => * => int[4] printf("%d
", sizeof(*arr)); // 16 sizeof(int[4]) // arr + 1 => int(*)[4] => * => int[4] printf("%d
", sizeof(*(arr + 1))); // 16 sizeof(int[4]) // arr => int[3][4] => int(*)[4] => * => int[4] => +1 => int* printf("%d
", sizeof(*arr + 1)); // 4 arr[0] => int[4] => & => int(*)[4] => +1 => int(*)[4] printf("%d
", sizeof(&arr[0] + 1)); // 4 sizeof(int(*)[4]) printf("%d
", sizeof(*(arr[0] + 1))); // 4 arr[0] => int[4] => +1 => int* => * => int
C 언어 중 sizeof()와 strlen()의 차이 점 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C 언어 sizeof()와 strlen()의 차이 점 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기