2012-07-31 3 views
0

가능한 중복 :함수에 전달할 때 C 문자열 길이가 변경되는 이유는 무엇입니까?

void printLength(char *s) { 
    sizeof(s); 
} 

하기에 "안녕하세요"전달할 때 :
C -> sizeof string is always 8

내가 sizeof("HELLO");을 할 경우 내가 가지고 그러나 경우, 예상되는 6을 얻을 이 함수에 sizeof은 8을 반환합니다.

왜 이런가요?

+3

때문에 8은'를 sizeof (숯불 *)는 '시스템에 : 포인터로 배열 붕괴

당신이 할 수있는 라이브러리 함수가있다. – hmjd

답변

3

고정 길이로 선언 된 문자열 리터럴 및 배열은 특별히 처리되므로, 컴파일러는 정확히 얼마나 큰지 알고 있습니다.

함수에서 컴파일러는 모든 포인터가 뭔가에 대한 포인터라는 것을 알고 있습니다. 문자 포인터의 크기를 취하고 있습니다 (이 시점에서 모든 컴파일러는 이에 대해 알고 있습니다). 64 비트 시스템을 사용하기 때문에 함수에 어떤 식 으로든 8 바이트 포인터가 생깁니다.

#include <string.h> 

int getLength(char * str) 
{ 
    return strlen(str); 
} 
6

크기가 char *입니다. 실제 길이를 얻으려면 strlen을 사용하십시오.

4

변경되지 않습니다. 배열은 포인터가 아닙니다. sizeof("HELLO")char 배열의 크기는 {'H','E','L','L','O','\0'}이고, sizeof(s)은 포인터의 크기를 제공합니다.

관련 문제