렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. C의 Generic 데이터 타입에 상관없이 하나의 함수로 동일한 동작을 수행하도록 하는 방식이다. 예를 들어 정렬을 하고자 할 때, 데이터 타입 (int, double ...)에 따라 별도로 함수를 구성한다면 유지보수 측면에서 상당히 비효율적일 것이다. 따라서 c++의 STL과 유사한 기능을 C로도 만들 수 있다. 어떻게 하면 generic하게 코드를 구현할 수 있을까? 이는 앞서 다룬 다양한 포인터에서 `함수 포인터`, `void 포인터`와 같은 응용 포인터를 활용하면 데이터 타입에 상관없이 기능을 수행하는 함수들을 구현할 수 있다. Generic for-eac..
렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. 1차원 포인터 int *p, *pp; int arr[5] = {10, 20, 30, 40 ,50}, num = 10; p = arr; //p는 배열명을 받으므로, p[1]과 같이 배열처럼 사용가능. *(p++)도 가능. // index 3의 주소는 &arr[2], &p[2], (p + 2), (arr + 2), &*&*(arr + 2) pp = # 1차원 포인터는 특정한 주소를 포인트 할 수 있다. `배열 명`, `함수 명`, `&변수명`은 주소를 나타낸다. 따라서 위의 예시 코드와 같이 포인터 변수를 선언하고 배열명을 대입 연산하게 되면 포인터 p는 배열..
렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. 시스템에 따른 데이터 타입의 차이 사용하는 시스템(ARM, POSIX)에 따라 같은 데이터 타입이라고 하더라도 크기가 다를 수 있다. 이를 인지하지 못하고 코드를 작성한다면 원치 않는 결과를 초래한다. 예를 들어 64bit 리눅스 시스템에서 정상 동작하던 코드가 윈도우 32bit에서는 동작하지 않을 수 있다. #include int main() { unsigned int a, b; unsigned long c; a = 100000000; b = 1001; c = (unsigned long)a * b; printf("c = %lu\n", c); return 0; }..
렉토피아 정혜경 강사님의 Secure & Generic C 강의를 듣고, 정리한 내용입니다. 해당 내용의 저작권은 정혜경 강사님에게 있습니다. 연산자 우선순위 연산자 우선순위를 알지 못하고, 적절히 활용하지 못한다면 원치 않는 결과를 초래할 수 있다. 포인터를 사용하더라도 `()`에 따라 다른 결과를 만들게 된다. #include int main() { int *p; int num[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; p = num; *p++; (*p)++; *++p; ++*p; return 0; } 간단한 코드이지만 연산자의 우선순위를 모른다면, 위의 코드가 어떤 결과를 반환하게 되는지 알 수 없을 것이다. `*p++` 포인터가 가르키는 위치를 1 증가시킨다. 이는 `*` 보..