아카이빙/C, C++

[C/C++] define, NULL, sizeof 헷갈리는 예시들

셩님 2018. 5. 24. 20:39

[C/C++] define, NULL, sizeof 헷갈리는 예시들


예시1)

#define A 12345
#define B 12345678910111213

int main(){
   printf("%d %d", sizeof(A), sieof(B));
   return 0;
}
  • define 전처리기로 상수를 정의할 때, 형변환이 자동으로 되는지 궁금했음.

  • 결과는 4, 8로 자동 형변환이 된다고 생각하면 될 듯.

  • 다음과 접미사를 통해 명시적으로 타입을 선언할 수 있다.

  • U, LL 등도 가능함.

#define var1 10i8 // char '2'
#define var2 10ui8 // unsigned char

#define var3 10i166 // short
#define var4 10ui16 // unsigned short

#define var5 10i32 // int
#define var6 10ui32 // unsigned int

#define var7 10i64 // long long
#define var8 10ui64 // unsigned long long


예시2)

int arr[] = { 1, 3, 5, 9, NULL, NULL };

printf("%d\n", sizeof(arr));
  • 결과는 24.

  • 그냥 0이 2개 더 들어간 것과 같다고 보면 되는 듯.

  • C에서 NULL은 #define NULL 0 으로 정의되어 있다.


예시3)

printf("%d\n", 0 == NULL);
printf("%d\n", NULL == false);
printf("%d\n", 1 == 1LL);
printf("%d\n", sizeof(NULL) == sizeof(false));

  • 결과는 1, 1, 1, 0

  • 0과 NULL은 같은 값이기 때문에 당연히 1이 출력된다.

  • 두 번째와 세번째 케이스는 타입의 사이즈가 관계없이 값이 같으면 같은지 알아보고자 함. 결론은 같다.

  • NULL은 int형 타입으로 정의 되어있음. 각 4바이트, 1바이트로 다르다.


'아카이빙 > C, C++' 카테고리의 다른 글

string과 character 배열  (0) 2018.05.26
malloc, calloc, realloc, free  (0) 2018.05.26
sizeof 포인터  (0) 2018.05.26
sizeof는 함수? 연산자?  (0) 2018.05.26
C언어 포맷출력 인자전달 (passing parameter to printf)  (0) 2017.07.13