반응형
크기 대 스트렐렌
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char string[] = "october"; // 7 letters
strcpy(string, "september"); // 9 letters
printf("the size of %s is %d and the length is %d\n\n", string,
sizeof(string), strlen(string));
return 0;
}
출력:
$ ./a.out
the size of september is 8 and the length is 9
제 구문에 무슨 문제가 있나요?
sizeof
그리고.strlen()
여러 가지 일을 합니다.이 경우, 당신의 선언은
char string[] = "october";
와 동일합니다.
char string[8] = "october";
그래서 컴파일러는 크기를 알 수 있습니다.string
8입니다. 컴파일할 때 이 작업을 수행합니다.
하지만,strlen()
실행 시 문자열의 문자 수를 카운트합니다.그래서, 당신이 전화한 후에.strcpy()
,string
이제 "9월"이 포함됩니다. strlen()
문자 수를 세어 9개를 찾습니다.다음을 위한 충분한 공간을 할당하지 않았습니다.string
"9월"을 개최합니다.정의되지 않은 동작입니다.
출력이 올바른 이유는
첫 번째 문 문자열 크기는 7+1인 컴파일러에 의해 할당되었습니다(10월은 7바이트이고 컴파일 시 null terminator의 경우 1바이트입니다).
두 번째 진술: 당신은 9월을 복사하고 있습니다(9바이트에서 8바이트 문자열);
그곳에서 당신은 9월의 크기를 8바이트로 얻었습니다. (여전히)strlen()
9월에는 작동하지 않습니다. null 문자가 없습니다.)
대상 배열은 8바이트("10월" + 0)이며 해당 배열에 9자를 넣으려고 합니다.
man strcpy
says: strcpy()의 대상 문자열이 충분히 크지 않으면 어떤 일이 발생할 수 있습니다.
당신이 정말로 무엇을 하고 싶은지 말해주세요, 왜냐하면 이것은 먼 길에서 나쁜 냄새가 나기 때문입니다.
언급URL : https://stackoverflow.com/questions/9937181/sizeof-vs-strlen
반응형
'programing' 카테고리의 다른 글
Oracle에서 JSON 배열 검색 (0) | 2023.06.19 |
---|---|
Git 내역에서 특정 수정본을 제거하는 방법은 무엇입니까? (0) | 2023.06.19 |
TypeScript의 ES7 Object.entries()가 작동하지 않음 (0) | 2023.06.19 |
Spring을 위한 Oracle 데이터 소스 구성 (0) | 2023.06.19 |
R은 어디에 패키지를 저장합니까? (0) | 2023.06.19 |