2015-02-06 3 views
0

c에서 우리는 데이터 유형의 크기를 얻기 위해 sizeof()을 사용합니다. 그래서 정의 방법. 매크로 또는 함수입니다. sizeof- function 또는 매크로?

우리는 두 가지 방법으로 그것을 사용할 수 있기 때문에

,

sizeof int 

이이 헤더 파일에 정의되어 어떻게

sizeof(int) 

.

+1

언어 구조가 아닙니다. –

+0

그것은 언어의 일부입니다 ... 어느 쪽도 의미하지 않습니다. – dandan78

+6

'sizeof'는 * 연산자 *이며 매크로 나 함수는 아닙니다. 첫 번째 변형 인'sizeof int'는 유형에만 사용할 수 있습니다. 두 번째 변형은 임의 표현식에 사용될 수 있습니다. 'sizeof' 연산자는 컴파일 타임 전용 기능이기 때문에 런타임 코드가 생성되지 않습니다. –

답변

2

을 사용해야합니다. 인수가 가변 길이 배열 (C99에 추가됨) 인 경우를 제외하고 컴파일 타임에 계산되는 값은 기본 제공 연산자입니다.

sizeof은 기능이 아니기 때문에 자주 볼 수있는 괄호는 이 아니며은 "통화"의 일부입니다. 그것들은 인수의 일부이며 인수가 캐스트 표현식, 즉 괄호로 묶인 유형의 이름 인 경우에만 필요합니다.

나는 개인적으로는 일반적으로 필요하지이기 때문에, 가능하면 인수로 형의 이름으로 sizeof를 사용에 대해 를 추천하고, 오류가 발생할 수있는 분리/디 커플 링을 만듭니다.

이 같은 것을 고려해

float *vector = malloc(100 * sizeof(double)); 

은 물론, 버그 이상이 포함 된 : floatdouble보다 작은 경우, 그것은 메모리를 많이 낭비됩니다. vectordouble의 배열로 시작되었지만 나중에 float으로 변경되면 위와 같은 것으로 끝나는 것을 상상하기 쉽습니다. 이 맞아야 보호하기 위해, 나는 항상 쓰기 :

float *vector = malloc(10 * sizeof *vector); 

는 위의 인수 *vector하지 그래서 괄호가 필요하지 않습니다 유형의 이름입니다 sizeof에 (유형 float의 표현)를 사용합니다.또한 요소의 크기를 고정시키는 데 사용되는 포인터에 "잠금"되어보다 안전합니다.

4

크기는 매크로도 함수도 아닙니다. 컴파일 타임에 계산되는 연산자입니다.

pr 처리 단계에서 평가되는 매크로.

@Yu Hao 가변 길이 배열이 지적한 유일한 예외입니다.

더 많은 이해를 위해 이것을 해결하십시오;

#include<stdio.h> 
    char func(char x) 
    { 
      x++; 
      return x; 
    } 

    int main() 
    { 
      printf("%zu", sizeof(func(3))); 
       return 0; 
    } 

    A) 1   B)2    C)3  D)4 
+0

매크로도 컴파일 할 때 평가됩니다. – m0skit0

+2

가변 길이 배열은 (유일한) 예외이며, 'sizeof' VLA는 런타임에 평가됩니다. –

+1

'size_t'유형의 값을 인쇄하기 위해'% d'을 사용하지 마십시오. '% zu'를 사용하십시오. – unwind

0

구문

  1. 를 sizeof (타입)
  2. 리스트를 sizeof 표현

는 두 버전 모두 형 표준의 일정한 :: size_t로를 반환합니다. 유형의 객체 표현의 바이트

설명

  1. 반환 크기입니다.
  2. 은 형식의 개체 표현의 크기 (바이트)를 반환합니다.이 경우 은 평가 될 경우 식에서 반환됩니다. ISO/IEC9899 가입일
2

6.5.3.4 sizeof의 운영자

제약

1 sizeof의 연산자 함수 타입 또는 불완전 을 보유하는 식으로 적용될 수 없다 이러한 유형의 괄호로 묶은 이름이나 이 비트 필드 멤버를 지정하는 표현식에 적용 할 수 있습니다.

그래서 매크로도 함수도 아닙니다. 연산자입니다!

그리고 다루는 방식은 컴파일러의 것입니다.

의미

2 sizeof의 운영자가 발현 될 수 있거나 피연산자의 크기를 바이트 수율 :

그러나 관한 표준 말한다 시간 런타임 판정 컴파일 유형의 괄호로 묶은 이름. 크기는 피연산자 유형 에서 결정됩니다. 결과는 정수입니다. 피연산자의 유형이 가변 길이 배열 유형이면 피연산자가 평가됩니다. 그렇지 않으면 피연산자가 평가되지 않고 결과는 정수 상수입니다.

따라서 VLA 경우를 제외하고는 컴파일 타임에 결정될 수도 있습니다.

0

단항 연산자 크기은 형식을 나타내는 데 필요한 바이트 수로 측정되는 모든 데이터 형식의 크기를 계산하는 데 사용됩니다.

많은 프로그램에서 특정 데이터 유형의 크기를 알아야하는 경우가 있습니다 (가장 일반적인 예로는 malloc 라이브러리 함수를 사용하는 동적 메모리 할당이 있습니다). C 또는 C++의 임의의 주어진 구현에 대해 특정 데이터 유형의 크기가 일정하더라도 C 및 C++의 짝수 기본 유형의 크기는 구현에 따라 정의됩니다 (즉, 표준에 의해 정확하게 정의되지는 않음). 이렇게하면 적절한 크기의 메모리 블록을 할당 할 때 문제가 발생할 수 있습니다. 예를 들어, 프로그래머가 int 타입의 열 개의 변수를 저장할만큼 큰 메모리 블록을 할당하려고한다고 가정 해보십시오. 가상의 프로그래머는 int 타입의 정확한 크기를 알지 못하므로 프로그래머는 malloc에 ​​요청할 바이트 수를 알지 못합니다. 따라서 sizeof :