sizeof 요넘이 자료형의 크기를 얻기위해 쓰이죠.

 

sizeof(int);

하면 int형이 몇바이트인지도 알 수 있고.

 

int i;

sizeof(i);

하면 변수 i가 몇바이트인지 알 수 있죠.

 

char arr[24];

sizeof(arr);

배열의 크기도 구할 수 있습니다.

 

---------------------------------------------------------

 

이러한 크기들은 어떻게 구하는 걸까요?

 

CPU가 계산해서 크기를 구하는게 아닌

컴파일러가 컴파일할때 크기를 인식해서 상수로 바꿉니다.

 

char arr[24];

printf("%d", sizeof(arr) );

여기서 sizeof(i)를 처리할 때...

컴파일러는 위의 배열을 선언한 부분을 참조합니다.

그리고 arr은 24바이트구나~~ 하면서

printf("%d", sizeof(arr) ); -> printf("%d", 24);

이렇게 바꿉니다.

 

----------------------------------------------------------

sizeof 는 컴파일러가 처리한다는 것을 알았으니

1개를 알려주면 10개를 안다는 분들은 감이 오실겁니다.

 

CPU가 32비트든, 64비트든, 운영체제가 32비트든 64비트든 간에

컴파일러가 32비트 컴파일러면 sizeof(int)는 모두 4로 처리된다는 겁니다.

 

32비트 CPU쓰고 32비트 운영체제를 쓴다 할지라도

16비트 컴파일러를 사용하면 sizeof(int)는 2가 됩니다.

 

-------------------------------------------------------------

 sizeof가 컴파일 될때 처리된다는 것을 알았으니

여기서 또 한가지를 알 수 있지요.

 

c언어로 표현하면

int *p;

p = malloc(16);

printf("%d", sizeof(p) );

일때, sizeof(p)는 어떻게 될까요?

정답은 16이 아닌 4 입니다.(32비트 컴파일러 기준)

 

p가 선언된 부분 int *p; 를 보고. 포인터는 4바이트니까 sizeof(p) -> 4

이렇게 한겁니다.

 

---------------------------------------------------------------------------

malloc(16)을 보면 16이라는 것을 알수 있는데, 컴파일러는 왜 4라고 처리하는가?

char arr[24];

printf("%d", sizeof(arr) );

배열 일때는 할당된 크기를 sizeof 값으로 처리했으면서.

 

 

malloc은 c언어 문법장치가 아닌, c언어 함수 입니다.

무슨말인가 하면, p = malloc(16);을 컴파일러 입장에서 보면.

"malloc 함수에 인자로 16을 주고, 리턴값을 p에 넣는다." 일 뿐이지 컴파일러에게 그 이상의 의미는 없습니다.

 

반면에 sizeof()는 함수가 아닌, c언어 문법장치 입니다.

그러므로 sizeof(p)가 "sizeof 함수에 p를 인자로 넣는다"가 아닌, "p의 바이트크기 상수값"을 의미하게 되는거지요.

 

배열일 때는, c언어 문법장치인 char arr[24]; 을 고려해서 sizof값을 정하는 것이고

포인터일 때는 c언어 문법장치인 int *p; 를 고려해서 sizof 값을 정하는 것입니다.

 

---------------------------------------------------

malloc 함수, 즉. 동적할당된 크기를 sizeof에 반영하지 않는 또다른 이유를 알아봅시다.

 

int *p;

int i;

scanf("%d", &i)

p = malloc(i);

printf("%d", sizeof(p) );

코드가 이러할때 sizeof(p)는 어떤 값을 가져야 할까요?

 

전에 말했듯이 sizeof는 c언어 문법장치이며, 함수도 아닙니다.

즉, 컴파일 될때 그 값이 결정되서 상수값으로 치환되어 컴파일 됩니다.

 

만약, malloc 으로 동적할당한 값을 sizeof 값으로 하려 한다면

컴파일 할때는 i의 값을 알수 없으므로 sizeof를 처리하는게 불가능 합니다.

 

이러한 이유도 있습니다.


출 처 : http://cafe.naver.com/haebop.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=5173

+ Recent posts