Programming/C&CPP

[펌] sizeof 와 _countof

deathnote 2009. 3. 18. 11:18
원글: http://dstein.egloos.com/1918111

sizeof 연산자는 피연산자의 크기를 byte단위로 구한는 것이고
_countof 매크로는 정적크기로 할당된 배열의 크기(배열 요소의 수)를 구하는 것입니다.

그리고 CRT 함수등과 같은것을 사용할때, 특히 문자열관련 함수들을 사용할때에는
파라미터가 정확이 어떤 값을 요구하는지 확인후 사용하여야합니다.
(Ansi환경에서는 문제가 되지 않았지만 Unicode 환경에서는 문제가됩니다.)

_tcs로 시작하는 함수중 _tcsncpy_s를 예로 들면


처번째 파라미터 strDest : Destination string.
두번째 파라미터 numberOfElements : The size of the destination string, in characters.
세번째 파라미터 strSource : Source string.
네번째 파라미터 count : Number of characters to be copied, or _TRUNCATE.


두번째와 네번째 파라미터는 문자열이 메모리에서 차지하고 있는 크기(Number of bytes)를 요구하는 것이 아니라
문자열을 구성하고 있는 문자의 갯수(Number of characters)를 요구하고 있습니다.
그렇기때문에 해당값을 sizeof를 사용해서 구하는것은 Unicode환경에서 문제가 발생될수 있다.

참고로 네번째 파라미터에 _TRUNCATE를 사용할 수 있습니다.

예) MSDN의 예를 사용함.

char dst[5];
strncpy_s(dst, 5, "a long string", 5);    -> 마지막 null를 위한 공간이 dst에 존재하지 않기때문에 오류가 발생.

_TRUNCATE는 대상지의 크기가 원본의 크기보다 작을경우 위와 같은 오류가 발생되지 않도록하고 대상지크기만큼만 정상적으로 값이 복사될수 있도록 한다.

strncpy_s(dst, 5, "a long string", _TRUNCATE);