2009. 3. 18. 11:18

[펌] sizeof 와 _countof

원글: 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);


2008. 8. 19. 13:50

동적 메모리 할당(1차 배열, 2차 배열)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
     char *cp;
     cp = (char*)malloc(sizeof(char)*20);
     strcpy(cp, "Hello World!!!");
     printf("cp = %s\n", cp);
     free(cp);

     int (*arr)[3];
     int i, j;
     arr = (int(*)[3])malloc(sizeof(int)*3*3);
     for(i = 0; i < 9; i++) arr[0][i] = (i+1)*10;

     for(i = 0; i < 9; i++){
          printf("%5d", arr[0][i]);
          if((i+1)%3 == 0) puts("");
     }
     puts("===================");
     for(i = 0; i < 3; i++){
          for(j = 0; j < 3; j++){
               printf("%5d", arr[i][j]);
          }
          puts("");
     }
     return 0;
}

2008. 8. 19. 13:47

1차배열을 포인터를 사용해서 2차 배열로 표현하기

#include <stdio.h>

int main()
{
     int arr[25];
     int (*ap)[5] = (int (*)[5])arr;
     int i, j;

     for(i = 0; i < 25; i++) arr[i] = (i+1)*10;
     for(i = 0; i < 5; i++) ap[i][i] = 0; //*ap[i][i]로 접근하면 에러남!!

     for(i = 0; i < 5; i++){
          for(j = 0; j < 5; j++){
              printf("%5d", ap[i][j]);
          }
          puts("");
     }
     puts("========================");
     for(i = 0; i < 25; i++){
          printf("%5d", arr[i]);
              if((i+1)%5 == 0) puts("");
     }
     return 0;
}

2008. 5. 28. 15:51

getimeofday로 현재 시간 구하기

http://uple.tistory.com/13

getimeofday 결과를 localtime에 넣어서 편하게 계산할 수 있었군
2007. 9. 7. 10:04

Fast C++ delegate

2007. 5. 29. 14:33

GCC - packed structures

2007. 3. 9. 14:50

Lookup tables - how to perform a switch using a string

2007. 3. 6. 13:04

Writing Efficient C and C Code Optimization

2007. 2. 26. 21:47

Writing Efficient C and C Code Optimization

2006. 4. 25. 17:13

Yacc와 Lex 시작하기