함수의 초기화 과정에서 종종 goto문을 사용하곤 한다. 예를 들면 열 가지 정도의 변수에 메모리를 할당 해 주는데, 다섯번째쯤 되는 변수를 처리하는 과정에서 오류가 발생했다고 가정해보자. 그럼 앞에 메모리가 할당된 네 개의 변수는 어떻게 될까? 할당해놓고 해제해 준 적이 없으니 메모리 누수상태가 된다. (Memory Leak) 그래서 변수 처리중에 에러가 발생 하면, 바로 return을 해버리는게 아니라 goto문을 이용하여 error 처리부로 이동시켜 메모리 해제해주는 작업을 거치게 된다. 윈도우에서 제공하는 try-finally 와 유사하다고 보면된다. goto문을 사용하는 간단한 예제는 다음과 같다. int Initialize() { // 이 예제에서는 CDialog라는 클래스가 있다고 가정한다...
atoi(), itoa() 함수에 대하여.. 블로그 유입로그를 보다보니 위의 함수에 관련된 유입이 많아서 위 함수에 관련된 포스팅을 합니다. 이 함수들은 stdlib.h 파일에 선언되어 있습니다. 다만, itoa 함수의 경우 비 표준함수입니다. C99/C11규격에서 정의되지 않고, MS 컴파일러에서만 이용가능한 함수입니다. 즉, Linux/macOS 등 비 마이크로소프트 운영체제(컴파일러)에서는 stdlib.h 헤더파일을 include 한다고 해도 itoa 함수를 사용하지 못합니다. 따라서 저는 itoa함수 대신에 다른 방법으로 문자열 전환을 권유해 드렸습니다. c/c++ sprintf, snprintf 함수 - 해당 포스팅을 보고 싶으시면 이곳을 클릭하세요 1. 문자열을 정수형으로 변환 이때 사용하는 ..
가변인자 함수가 있듯이, 매크로도 가변인자 매크로가 있습니다. 가변인자 매크로 역시 ... 의 매개변수를 받는데요. 매크로의 경우 가변인자 함수보다 훨씬 사용하기 간편하게 되어있어 자주 사용하는 편입니다. #define VA_PRINT(fmt, ...) printf(fmt, __VA_ARGS__) 위와 같이 사용할 수 있습니다. 가변인자 함수 때처럼 va_startf나 vnprintf 따위의 매크로를 이용할 필요가 없습니다. __VA_ARGS__ 를 넣어주면 알아서 포맷으로 변환하여 출력해 줍니다. C코드 예제를 하나 만들어보았습니다. #include #define VA_PRINT(fmt, ...) fprintf(stdout, "결과: " fmt "\n", __VA_ARGS__) int main() { ..
1. # 연산자 매크로에서 # 연산자는 문자열로 변환(치환) 시켜주는 연산자 입니다. 아주 단순한 예를 들어보았습니다. 아래의 예제를 한번 살펴보도록 하겠습니다. #include #define PRINT(s) printf(#s) int main() { PRINT(THIS IS TEST CODE); return 0; } 만일 PRINT 매크로에서 s앞에 붙은 #이 빠지게 되면 오류가 발생하게 됩니다. 왜냐하면 매크로변수 s는 THIS IS TEST CODE를 받게 되는데, c 문법에 따라 따옴표가 없기 때문에 이것들을 하나의 '변수'로 인식하게 됩니다. #을 빼주고 "THIS IS TEST CODE" 라고 앞뒤로 따옴표를 붙여주면 잘 실행이 됩니다. 즉, #은 받아온 매크로변수를 문자열로 바꿔주는, 더 쉽..
bsearch 라는 함수는 특정 배열안의 값을 찾고자 할 때, 이진 탐색의 방법으로 빠르게 찾아주는 함수입니다. 단, 이진탐색이라는 특징 상 배열은 반드시 정렬(sorting)되어 있어야 합니다. * 이진탐색이란? - 가운데에서부터 탐색을 시작하며 오름차순으로 정렬되어 있는 배열의 경우, 찾는 값이 비교대상의 값보다 작으면 왼쪽에, 비교대상의 값보다 크면 오른쪽에 위치하게 됩니다. 배열을 계속 반씩 잘라가며 탐색을 하며, 따라서 배열의 개수 n에 대하여 O(log n)의 속도로 탐색이 가능합니다. 배열의 개수가 많아질수록 더욱 효과적이게 됩니다. 아래는 이진탐색의 예제입니다. 1부터 100사이의 임의의 숫자 10개가 배열안에 정렬되어 있습니다. 86을 찾고자 할때, 이진 탐색의 경우 아래와 같이 이루어집..
C언어 가변 인자(가변 파라미터)를 사용해보자 1. 가변인자란 무엇일까? printf 함수를 써보셨나요? 우리는 자연스럽게 printf("%d * %d = %d", 3, 5, 3*5)라고 쓰고 있습니다. 가만보면 printf라는 함수는 인자를 1개만 넣어도 되고, 2개만 넣어도 되고, 3개, 4개 그 이상을 넣어도 문제없이 돌아갑니다. c언어에서 이런것이 가능한가요? 오늘은 이런 마법을 부릴 수 있게 하는 가변 인자라는 것에 대해 포스팅을 하겠습니다. 2. printf의 원형 printf 함수의 원형을 찾아보신 분이 계실지 모르겠습니다. printf의 원형을 찾아보면 다음과 같습니다. int printf(const char* format, ...) 참조: 컴파일러에 따라 printf의 실제 구현과는 원형..
c/c++ sprintf, snprintf 함수 sprintf라는 출력함수가 있습니다. 이 함수는 printf와 비슷하게 사용되지만, 다른점은 printf는 모니터 화면에 입력한 문자열이 출력된다면, sprintf는 버퍼로 사용될 변수로 출력이 됩니다. 즉, char * 로 선언된 변수안에 입력된 내용이 문자열로써 담기게 되는 것이죠. snprintf는 2번째 파라미터로 size가 추가된 함수로, 버퍼 오버플로우를 막기위해 문자열의 길이를 지정하는 좀 더 안전한 함수가 되겠습니다.우선 함수의 프로토타입을 먼저 보도록 하겠습니다. int sprintf (char *buffer, const char *format, ...) int snprintf (char *buffer, int buf_size, const..
C언어 qsort() 함수 C언어에서는 Quick sort를 손쉽게 사용할 수 있도록 라이브러리가 구현되어 있습니다. 함수의 프로토타입은 다음과 같습니다. void qsort (void *base, size_t nel, size_t width, int (*compare)(const void *, const void *) 함수명 : qsort 필요헤더 : stdlib.h 리턴타입 : void 파라미터 : 정렬 할 배열 배열의 총 엘리먼트 개수 배열 한 개의 크기 비교를 수행할 함수의 포인터 리턴값 : 없음 함수역할 : 퀵 소트(Quick sort)를 이용하여 배열을 정렬한다. 헤더파일 stdlib.h가 미리 선언되 있어야 하구요. 참고로 void * 라는 것은 어떠한 타입이든 상관없이 포인터를 받을 수 있..
sizeof가 어떤 구조체나, 배열의 전체 사이즈의 byte를 구해준다면, _countof 는 배열의 개수를 구하는 매크로 이다. * _countof는 비주얼스튜디오에서만 사용이 가능하다. 다음과 같은 예제를 보자.int arr[10] int 형 타입의 배열을 선언한다. 이 배열을 가지고 sizeof 와 _countof 를 사용한다면,sizeof(arr) 의 결과 값은 40 (4 바이트인 int 타입이 10개) _countof(arr) 의 결과 값은 10 (10개의 배열) 이 된다. _countof는 비주얼 스튜디오에서만 사용 가능한데, 사실 단순한 매크로일 뿐이기 때문에 우분투에서 사용하려면 간단히 매크로를 풀어주면 된다. #define _countof(_Array) sizeof(_Array) / si..
c언어 - 함수포인터 (Function pointer) 오늘은 함수포인터에 대해서 포스팅을 하도록 하겠습니다.포인터가 무엇인지는 다들 아실텐데요, 특정 변수에 대한 메모리 주소를 담을 수 있는 변수를 포인터 변수라고 합니다. 그렇다면 함수포인터란, 특정 함수에 대한 메모리 주소를 담을 수 있는 것 이라고 정의할 수 있겠습니다. 함수포인터를 쓰는 이유는 무엇일까요? 프로그램 코드가 간결해집니다. 함수포인터를 배열에 담아서도 사용할 수 있으므로 중복되는 코드를 줄일 수 있습니다. 상황에 따라 해당되는 함수를 호출할 수 있으므로 굉장히 유용합니다. 그 외에도 함수 포인터를 이용하여 콜백함수를 구현할 수 있게 되는 등 편리하고 유용한 코드를 작성할 수 있게 됩니다. 우선 함수포인터의 모양에 대해 알아보도록 하겠..
- Total
- Today
- Yesterday
- NgZone
- qemu linux arm
- ECMA2015
- terminal 색
- QT
- 타입스크립트
- typeScript
- vim
- JavaScript
- ansi color
- zone
- 우분투 16.04
- ZONES
- 안시 컬러
- git proxy
- Swift
- angular2
- git 설정
- 챗봇
- itoa
- 폰트 조정
- Rx.js
- 안시 색상
- lua table
- Zone.js
- observable
- 스위프트
- Angular
- 리눅스 터미널 색상
- C언어
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |