Advanced/C Trick
[C언어] 가변 길이 배열(Variable-length Array)를 사용할 때
[C언어] 가변 길이 배열(Variable-length Array)를 사용할 때
2021.01.23가변 길이 배열(Variable-length Array)은 배열의 크기를 컴파일 타임에 정하지 않고 실행 타임에 정할 수 있도록 하는 기능이다. TLDR; malloc은 메모리 수동 관리, VLA는 자동 관리 C11에서는 지원이 필수가 아님 -> C++17에서도 지원이 필수가 아님 VLA는 편리하지만 큰 크기의 배열을 사용할 때에 적합하지 않음 malloc과 VLA C99 에서는 해당 기능을 제공한다. int input_array_size(int size) { int array[size]; ... return 0; } 해당 기능을 지원하지 않는 C 버전을 사용할 때에는 아래와 같이 malloc을 이용해서 위 기능을 구현할 수 있지만, 그래도 위 기능을 직접 사용한다면 더욱 편리하게 구현할 수 있다. in..
==과 =의 오타를 피하는 방법
==과 =의 오타를 피하는 방법
2016.12.23==과 =의 오타를 피하는 방법다음과 같은 소스코드가 있다고 해봅시다.if (num == 10) printf("num은 10입니다. \n");cs만약, 이 코드를 잘못입력해서 if (num = 10)과 같이 입력을 했을 때 문법적으로는 틀린 것이 없으므로 문법 오류가 발생하지 않아서 발견하기가 상당히 어려운 언어가 됩니다.하지만, if (10 == num)으로 순서만 바꾸면 문법적으로는 아무런 이상이 없으며, ==를 잘 못 입력해서 =으로 입력했을 시 if (10 = num)이 되어서 문법 오류가 발생하므로 논리에러를 잡아내는 데 유용합니다.
임시변수 없이 swap 구현하기
임시변수 없이 swap 구현하기
2016.12.22임시변수 없이 swap 구현하기먼저 이 방법을 알려주는 것은, 이 것이 위험하기 때문에 지양해야 한다는 것을 알리기 위함입니다.먼저, 그 방법을 소개해보면 #define SWAP(x, y) {(x)^=(y)^=(x)^=(y);} 이와 같은 매크로가 정의되어 있다고 해봅시다.int main() { int x = 10; int y = 20; printf("X = %d, Y = %d", x, y); x ^= y ^= x ^= y; //SWAP(x, y); printf("X = %d, Y = %d", x, y); return 0;}Colored by Color Scriptercs위의 코드와 같이 매크로가 풀리게 될 텐데, 이것을 하나씩 뜯어보면 제일 위의 것부터 x ^= y; -> x = x ^ y; 그러면 x..
do { ... } while(0) 을 사용하는 이유
do { ... } while(0) 을 사용하는 이유
2016.12.21do { ... } while(0) 을 사용하는 이유원문 : https://kernelnewbies.org/FAQ/DoWhile0리눅스 커널 등의 소스 코드를 보게 되면, "do { ... } while(0)"과 같은 것을 많이 씁니다. 당연히 중괄호 안의 내용이 한 번만 실행되고 끝나는 프로그램인데, 왜 이렇게 만들었을까요?다음과 같은 이유가 있습니다. ▶ Miller : 빈 구문(empty statement)는 컴파일러가 경고를 냅니다. ▶ Miller : 지역 변수를 선언할 수 있는 구역을 만들어줍니다. ▶ Collins : 조건문을 포함한 코드에서 복잡한 형태의 매크로를 사용할 수 있도록 해줍니다.#define FOO(x) \ printf("arg is %s\n", x); \ do_somethin..