2014-07-09 3 views
0

const void *의 데이터 크기에 관한 질문이 있습니다. 아래 코드에서 첫 번째 printf의 출력은 6이고 두 번째 printf의 출력은 3입니다. 문제가 발생한 부분을 찾을 수 없습니다. 사전글자 크기 및 const void *

#define TEST "\x00\x01\x02\x03\x04\x05" 

#include <stdio.h> 

static void function(const void* c); 

int main (void) { 

    printf("TEST: %d\n",sizeof(TEST) -1); 
    function(TEST); 

    return 0; 
} 

static void function(const void* c) { 
    printf("TEST: %d\n",sizeof(c) -1); 
} 

답변

5

첫 번째 경우, sizeof(TEST)은 모든 문자와 터미네이터 (이 경우 7 바이트)를 포함 할 수있을만큼 큰 배열 인 문자열 리터럴의 크기입니다.

sizeof(c)은 32 비트 플랫폼에서 포인터의 크기 - 4 바이트입니다.

일반적으로 포인터를 지정하면 배열의 크기를 알 수있는 방법이 없습니다. C 스타일의 종료 문자열을 가리킨 경우 strlen(c)으로 길이를 측정 할 수 있습니다. 그러나이 경우 null 문자가 포함되어 있으므로 길이를 결정할 방법이 없습니다. 보다는, 이것은 당신이 컴파일 타임 오류가 발생합니다 장점이있다

template<typename T, size_t N> size_t array_size(T(&)[N]) {return N;} 

:

C++에서

, 당신은 배열의 크기를 얻기 위해, 오히려 sizeof보다 템플릿을 사용할 수 있습니다 실수로 배열 대신 포인터에 적용하면 예기치 않은 런타임 결과가 발생합니다.

+0

나는 strlen (c)로 시도하지만 크기는 0이된다. 좀 더 자세한 정보를 제공해 주시겠습니까? 고맙습니다! – user3821117

+0

@ user3821117 : 문자열은 null 문자로 시작하므로 길이가 0 인 것으로 보입니다. 유효한 C 스타일 문자열이 아니기 때문에 길이를 찾을 방법이 없습니다. –

1

sizeof 연산자 주셔서 감사합니다는 유형 이름 또는 sizeof(char)에 대한 표현 중 하나의 바이트 수를 반환합니다. 이 단항 표현이고 그것이 널 바이트 terminattor을 포함하여,이 문자열의 바이트 수를 반환하지 않습니다 당신 sizeof(TEST) 같은 문자열 리터럴의 경우

sizeof unary-expression 
sizeof (type-name) 

: 다음 구문을 가지고 있습니다. 이 int 결과 유형이 2*p 같은 식의 경우에, 표현은 sizeof(int)

또는 그것의 경우, (어떤 부작용없이) 컴파일 시간과 결과 형의 크기 (int) 반환에 평가 type-namesizeof(c)처럼이 유형의 플랫폼 독립적 인 바이트 수를 반환합니다. 예 : 32 비트 시스템의 sizeof(int)4 바이트입니다.

+0

'sizeof'는'char'의 수로 크기를 반환합니다. – clcto

+0

@clcto,'sizeof'는 항상 바이트 단위로 측정됩니다. 'char'는 1 바이트입니다. – chris

+0

@chris 'sizeof (char)'는 1로 정의되고 char의 바이트 수는 구현이 정의됩니다. – clcto

관련 문제