모든 글 보기963 Valiable Arguments #include // 가변 인자를 가지는 함수. ==> ... : 컴파일러에게 인자 확인을 행략 해달라는 의미. ! // 핵심 : 전달된 인자를 꺼낼수 있어야 한다. !! #include // minprintf : The C Programming language 에 있는 코드 입니다 // (1988년) 설명은 별로 지만 예제가 너무나 좋은 책 입니다 나중에 예제만 꼭 한번 보세요. // printf("%d %s %c %f", ); // 만들어 보고 싶다..ㅋ void foo(...); 모두 가변인자. //c++ : ok; //c : 1번째 인자는 이름이 있어야. int printf( const char* , ...) { } void main() { int n =20; printf( "%d \n" ); /.. 2009. 7. 19. typedef에 관하여 // 왜 typedef 를 즐겨 사용하게 되는가? - 다른 machine으로 porting 해야 할 경우 대비 // 미래에 바뀌게될 환경에 대비 . #include //type.h 하는 헤더로 묶어두자. typedef short int16; typedef int int32; typedef char int8; void main() { //아래 코드가 가질수 있는 문제점은? short b = 0; b = 80000; printf("%d\n",b); } 2009. 7. 19. Quick Sort #include #include typedef int(*Sort)(void * , void *); void swap(void *p1, void *p2, int s) { int i; char *p3 = (char *)p1; char *p4 = (char *)p2; char t; for(i=0; i 2009. 7. 19. Function Pointer EX #include // 함수포인터 예제 // 컴파일해서 라이브러리로 보관(즉 이진 기계어 코드 형식으로) typedef int(*Compare)(int, int); // 결국 qsort()의 원리가 이처럼 함수를 인자로 받아서 sort 한다. // 알고리즘은 : sort 함수가 // sort 기준은 : 사용자가 void sort(int* x, int sz, Compare cmp) { int i, j, temp; for(i=0; i 2009. 7. 19. 함수 및 포인터 #include // 10 page => 복잡한 표현식. -> C에서 복잡한것은 배열 포인터 아니면 함수 포인터 밖에 없다. // int (*p)[2]; //배열 포인터 // void (*f)(int); //함수 포인터 (정확한 모양을 어딘가에 적어 놓으세요..) // fp1은 ? // 절대 아래 표현은 사용하면 안된다 !!! -> 하지만 해석할줄은 알아야 !! // 실제로는 typedef로 해야 한다 !! // 숙제 10 page 4가지 표현을 모두 typedef 바꾸어서 만들어 보세요 !!. void*(*(*fp1)(int)[10]; // 1. symbol을 찾아라 ! -> fp1 // 2. symbol 뒤가 "(" ==> 무조건 함수. // "[" ==> 무조건 배열. // ")[" ==> 무조건 .. 2009. 7. 19. Flexible Array // 1. Data Align - VC 에서는 #pragma pack (1) // 2. struct hack ==> flexible Array 이야기 #include #include // Data Align(정렬,기본적으로 4byte단위)로 개념 #pragma pack( 1 ) //모든 컴파일러 마다 다르다 (해당 컴파일러의 메뉴얼 참고) // 하지만 여기서 Align 개념을 정확히 익혀 두세요 ~~ //실행시 결정되는 크기의 배열을 사용하는 구조체 만들기. - "struct Hack" 이라는 기법. //1980년대 주로 사용 /* sizeof(People) ==> 8 struct People { int no; //학번 int jumsu[1]; // 과목수가 실행시까지 정해 지지 않았다면.! }; */ .. 2009. 7. 19. Error Handling //Assert()의 필요성.. 디버깅을 최대한 편하게.. // # 매크로에 대해서..-- 무슨 의미 일까? j 해당 심볼을 문자열로 풀어 달라. // ## 매크로 - win 32 배울때 사용하게 됩니다.. token paste // ### 없다 #include #define out( x ) printf("%d %d\n", x##1, x##2 ); void main() { int x1 = 10, x2 = 20; out( x ); } /* #define dprint( x ) printf( #x " = %d\n",x); void main() { int n =10; dprint(n/2); //printf("n" " = %d\n",x,n); pritnf("aaa" "bbb" "ccc"); //"aaabbbccc.. 2009. 7. 19. Dos Compilering & Make Asm 도스 컴파일 & 어셈블리 생성 // 결국 모든 컴파일러는 console 프로그램입니다. // 1. VC++의 경우 cl.exe --> 사용법 알아두기 !! // 2. "cl /help" 입력해보기 // 3. "cl a.c /Fa" a.asm 이 생성됩니다 // 결론 cl 컴파일러를 사용해서 C소스를가지고 어셈 코드 만드는법 꼭 기억하기..!! //VC++ compiler 이름 : cl.exe의 console application void foo(int a,int b) { a = 20; b = 20; } void main() { foo(1,2); // 인자의 전달은 마지막 인자 부터 stack을 통해서 전달한다 } 2009. 7. 19. Buffer OverFlow // 1. 함수 호출시 Stack의 모양을 정확히 알아두세요! // 2. 배열의잘못된 index 가 실행시 문제가 될수있다 (컴파일시 확인 안됨) #include #include #include // 아래 함수는 안전한가? void foo2(const char* p) { char buf[10]; strcpy(buf,p); // ?? 안전하지 않은함수 //방법 1 strncpy 사용 strncpy(buf,p,9); //방법 2 char* buf=(char*)malloc(strlen(p)+1); strcpy(buf,p); } void goo() {printf("goo\n"); exit(0);} void foo(int a, int b) { int x=0; int y[2]; y[4] = (int)goo; //어.. 2009. 7. 19. 이전 1 ··· 82 83 84 85 86 87 88 ··· 107 다음