안녕하세요. 궁금증연구소 입니다.
오늘 포스팅 주제는 "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바이트 인 것일까?
이유는 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바이트가된다.
[c++] 배열의 sizeof 연산자 구할때 주의할점(매개변수 sizeof와 차이) (2) | 2022.09.19 |
---|---|
[C언어]Suspicious pointer conversion 에러 (0) | 2022.09.10 |
c언어 버퍼비우기 (%*c) (0) | 2022.08.06 |
[C언어] 구조체의 문자열포인터는 변경시 참조하는 모든 값이 변경됨 (0) | 2022.08.02 |
[C언어] 문자열포인터와 문자열의 차이점 (0) | 2022.07.27 |