궁금증 연구소

안녕하세요. 궁금증연구소 입니다.

오늘 포스팅 주제는 "C언어 sizeof(자료형) 간단정리" 입니다.

 

#include <stdio.h>

main(){
    int arr[]={1,2,3,4,5};

    printf("%d\n", sizeof(arr));
    printf("%d\n", sizeof(int[5]));
    printf("%d\n", sizeof(int));
    printf("%d\n", sizeof(arr[0]));
}

위와같은 배열을 출력하면 값이 어떻게 될까?

답은 아래와 같다.

출력결과

 

우선 3번째 int는 당연히 int 형 자료형의 크기를 말하는 것이니 4바이트가 찍힌다. arr[0] 도 자료형은 int이다. int형 배열의

요소이니 어찌보면 너무 당연하다.

 

배열에서 arr의 이름은 주소값을 가지고 있는 변수(포인터)라는 것은 C언어를 배운사람이라면 알고 있을 것이다. 그렇다면 상식적으로 포인터의 sizeof 를 했는데 왜 1번 값은 20바이트가 나오는 것일까? 

 

#include <stdio.h>

main()
{
    int a = 1;
    int *p = &a;

    printf("%d\n", sizeof(a));
    printf("%d\n", sizeof(p));
}

포인터 변수 크기는 모두 일괄 4바이트이다.  위와같이 변수 a의 값에 대한 포인터 p의 크기를 보면 아래와 같이 4바이트가 당연히 나온다. 그런데 왜 배열포인트 이름의 크기는 20바이트 인 것일까?

출력결과2

 

이유는 sizeof 연산자는 자료형을 기준으로 size를 측정하기 때문이다. 즉 위 예시의 포인터 p의 자료형은 int이다. 그러나 배열포인터의 자료형은 int가 아니라 int[5]가 된다.

 

즉, 배열의 각 요소값의 자료형은 int이고 배열이름의 자료형은 int[5]가 된다.

 

#include <stdio.h>

main()
{
    int a[2][3] = {{1,2,3},{4,5,6}};
    

    printf("%d\n", sizeof(a));
    printf("%d\n", sizeof(int[2][3]));
    printf("%d\n", sizeof(int[2]));
}

 

따라서 위와같은 2차원 배열에서도 배열이름 a의 자료형은 int[2][3] 이고, 따라서 자료형의 크기는 4*2*3 인 24바이트가된다.

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading