반응형

Embedded/Programming language : C 10

[C] 가변 인수 (2) : 가변 인수 함수를 꼭 써야 가변인수를 사용할수 있는걸까?

일반 함수 매개변수의 주소값과 가변인수함수의 주소값을 살펴보았습니다. 그 두가지의 주소값 할당은 비슷한점이 많았습니다. 그럼 아래와 같이 가변인수함수를 사용하지 않아도 가변인수의 값을 가져올 수 있지 않을까요? #include int sum(int i, ...); void main() { printf("\n%d\n", sum(3, 1, 2, 3)); } int sum(int i, ...) { int sum = 0, j; int *p = &i + 1; for (j = 0; j

[C] 가변 인수 (1) : 가변 인수 함수의 주소는 어떻게 될까

일반적으로 가변인수를 사용하는 방법은 아래와 같습니다. #include #include //가변 인수를 사용하기 위한 헤더파일 int sum(int i, ...); void main() { printf("\n%d\n", sum(3, 1, 2, 3)); } int sum(int i, ...) { int j, t, sum = 0; va_list sp; //가변 인수들의 주소를 저장할 지역변수 va_list. Type은 char* va_start(sp, i); //가변 인수 바로 앞에있는 고정매개변수를 받는다. 이 함수의 매개변수에서 가변인수(...) 앞에는 int i 이므로 i를 넘긴다. for (j = 0; j < i; j++) { t = va_arg(sp, int); //int형으로 참조하여 값을 가져온..

[C] 선언한 배열의 index 이상을 접근하면 어떻게 될까?

길이가 10인 1차원 배열이 있다고 하겠습니다. 그럼 index의 범위는 0 - 9 입니다. 만약 이를 초과한 10에 접근하면 어떻게 될까요? 우리의 컴파일러는 친절하게도 문제가 있다는것을 밑줄로 알려줍니다. (Debug Mode에서는 프로그램을 실행하면 메모리 접근 에러가 납니다. 정말 친절해서 너무나 고마운나머지 Test는 Release Mode에서 진행했습니다. ) 그런데 에러가 아닌 경고가 메시지가 발생합니다. 컴파일도 아주 잘 되죠. 동작시키면 쓰레기 값이 나오지만요 ^^ 그럼 배열범위를 벗어난 메모리 값을 초기화를 해버리면 어떻게 될까요?? 결과는 에러없이 아주 잘 동작합니다. 경고는 존재하지만요. 이를통해 알 수 있는것! 1. 배열의 크기를 10으로 지정한다고 해서 10만 쓸수 있는것은 아니..

[C] Typedef 손쉽게 이해하기.

C언어에서 Typedef 는 자료형을 재정의 할 수 있도록 하는 아주 유용한 키워드입니다. typedef (자료형이름) (재정의할 자료형 이름) 로 되어있는 아주 쉬운 구조이죠. 사용방법을 간략하게 예를들면 아래와 같습니다. typedef int INT32; //int를 INT32로 재정의해서 사용할거에요! INT32 a = 1000; // int a = 1000 이랑 같은 뜻! 사실 위와같은 케이스에 대해 이해하는건 정말 쉽습니다. 그런데 이에 대하여 처음 접하거나 익숙하지 않은 경우 간혹 헷갈리는것들이 있습니다. typedef void (*fun)(int,int); //함수포인터 자료형! typedef int (*arr)[10]; //포인터 배열 자료형! 위 두개는 함수포인터의 자료형과 포인터 배열의..

[C] 매크로 함수 이해하기

아래와 같은 코드가 있습니다. #include int add_int(int x, int y); float add_float(float x, float y); #define fun( name0, name1, x, y )name0##_##name1(x,y) #define out( name0, name1, data )out_##name1(name0, name, data) #define out_int(name0, name1, data)printf(#name0"_"#name1 ": [ %d ]\n", data) #define out_float(name0, name1, data)printf(#name0"_"#name1 ": [ %f ]\n", data) void main() { int ia = 200, ib = 3..

[C] 매크로 함수에서 do~while(0)을 쓰는 이유

매크로 함수를 보다보면 do~while(0) 형태로 되어있는것을 보게 됩니다. #define add(a,b,c) do{a = a + b; }while(0) 왜 이렇게 사용하는지 한번 알아볼께요. 아래는 일반적인 매크로 함수 입니다. #include #define add(a,b,c) {a = a + b; \ c = a + b;} void main() { int a = 300, b = 200, c; if (a > b) { add(a, b, c); //if에 { } 를 사용! } else { printf("Test"); //else에 { } 를 사용! } printf("[ %d %d %d] \n", a, b, c); } 위 코드를 컴파일 해보면 정상적으로 동작합니다. 자 이제 if와 else의 소괄호를 없애고..

[C] 정수 연산시 반올림 연산 방법

15/4 = 3.75 이며, 16/5 = 3.2 이다. 반올림을 하고 싶을때 두가지 방법이 있다. 연산후 0.5를 더하거나, 피연산자에 연산자의 절반을 더하고 연산하는 방법이다. 1) 1>> ((double) 15 / 4) + 0.5 1>> (16+2.5) / 5 2>> (15.0 / 4) + 0.5 2>> 18.5 / 5 3>> 3.75 + 0.5 3>> 3.7 4>> 4.25 4>> 3 5>> 4 피연산자에 연산자의 절반을 더하고 연산하는게 더 속도가 빠르다.

반응형