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()의 차이 점 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!