programing

크기 대 스트렐렌

telecom 2023. 6. 19. 21:08
반응형

크기 대 스트렐렌

#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";

그래서 컴파일러는 크기를 알 수 있습니다.string8입니다. 컴파일할 때 이 작업을 수행합니다.

하지만,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 strcpysays: strcpy()의 대상 문자열이 충분히 크지 않으면 어떤 일이 발생할 수 있습니다.

당신이 정말로 무엇을 하고 싶은지 말해주세요, 왜냐하면 이것은 먼 길에서 나쁜 냄새가 나기 때문입니다.

언급URL : https://stackoverflow.com/questions/9937181/sizeof-vs-strlen

반응형