Language/C

sizeof - 함수가 아닌 연산자.

TechNote.kr 2016. 7. 4. 00:04
728x90

 C언어를 접한지도 오래되었지만 때때로 내가 이리도 모르는 부분이 많았던가 하는 생각이 종종 들곤 한다. 그리도 많이 써왔던 sizeof에 대해 좀 더 정확한 사용 방법을 알아보기 위해 man page를 찾아보았는데, 아무리 man sizeof 를 해보아도 man page가 나오질 않았다. 혹시나 내가 미처 설치하지 못한 package가 있는가 해서 나오질 않는 것인가 해서 좀 찾아보았다.


 수 많은 sizeof 관련 글 가운데 sizeof는 함수가 아니라 연산자여서 man page가 없다는 글을 보게 되었다. 순간 이게 무슨 소리 인가 했다. man page가 없는 이유가 연산자여서 라는 건가....연산자인데 왜 man page가 없는 거지????


우선 연산자이기 때문에 man page가 없다 .

==> 연산자인 +, -, *, / 에 man page가 없듯이 연산자이기 때문에 man page가 없다고 한다. 


sizeof 가 함수가 아니라 연산자이다. 

==> sizeof() 이런 형식으로 써왔기에 당연히 glibc에서 지원하는 함수로만 생각하고 있었다. 하지만 +, -, *, / 와 같은 연산자라고 한다. 함수일 경우 runtime 때 argument로 받은 인자를 바탕으로 해당 부분을 처리하고 return 값을 주게되지만 해당 부분은 연산자이기 때문에 compile time때 그 결과를 바로 상수로 치환하게 된다. 


예를 들어 보면 다음과 같다.


void func1(int a)

{

    char *p;


    p = malloc(sizeof(char) * a);

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

}


==> 결과 4


우선 위 코드에서 p의 sizeof는 4가 출력된다. 여기서 4는 pointer인 p가 가리키는 주소를 저장하는 주소 저장 공간 크기 4를 의미한다. p가 가리키는 공간의 크기는 runtime 때 넘어오는 argument a에 의해 결정되기 때문에 compile time때 그 결과를 표시하는 sizeof()는 pointer p의 그 자체 주소 저장 공간인 4로 치환되게 된다. 

(compile time 때는 a값을 알 수 없고, 다양한 값이 넘어올 수 있기 때문이기도 하다.)


그렇다면 다음은 어떻게 될까


void func1()

{

    char p[20];


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

}


위의 경우는 p의 sizeof의 경우 20으로 출력된다. p의 경우 20의 크기로 선언되어 있기 때문에 compile time때 그 크기를 알 수 있기에 p는 20으로 치환되게 된다.


sizeof의 사용 방법


sizeof를 사용하는 대상에는 2가지가 있다. 변수와 type이다. 


예를 들면 다음과 같다.


[case 1, 변수를 대상으로 sizeof 사용]

int a = 1, b;

b = sizeof(a);


[case 2, type을 대상으로 sizeof 사용]

int a = 1, b;

b = sizeof(int);


위 두 예제의 결과는 모두 같다. 


추가적으로 변수의 경우는 2가지 방법으로 사용이 가능하다.


[case 1, 괄호 사용 경우]

int a = 1, b;

b = sizeof(a);


[case 2, 괄호 미사용 경우]

int a = 1, b;

b = sizeof a;


좀 더 깊이 있는 코딩을 하기 위해서는 화려한 라이브러리 사용도 중요하겠지만 깊이 있는 기본기를 통해 명확한 코드를 만드는 것도 중요하다는 생각을 해보게 되었다. 이런 기본적인 연산자 사용에 아직도 이해할 것이 많다는 것에 다시 하여금 놀라게 되었다. 

728x90

'Language > C' 카테고리의 다른 글

Signed / Unsigned 의 비교  (0) 2019.08.24
Type casting 시 주의해야할 점. (signed, unsigned)  (0) 2016.07.04
memset - 하위1byte pattern 의 이해  (2) 2016.07.01