Soft Ware/C 언어!! 38

ctime 함수

ctime 함수의 원형은 char * ctime(const time_t * timer); 로서 이 함수의 기능은 time함수로부터 얻어진 값을 문자열로 바꾸는 기능이 있다. timer 가 가리키는 time_t 형 변수를 읽어들여서, 그 값을 해석 하여 지역 시간에 맞추어 아래와 같은 형식으로 문자열로 바꾼다. Www Mmm dd hh:mm:ss yyyy Www는 요일, Mmm 은 월 이름, dd 는 몇일인지, hh:mm:ss 는 현재 시간, yyyy 는 현재 년도를 말한다. 이때 문자열 끝에는 자동으로 \n과 NULL 문자가 들어가게 된다. time_t 값을 해석해서 만든 문자열이 리턴된다. 이때 조심해야 될것이 asctime(localtime(timer)) 라는 함수와 ctime 함수가 참조하는 메..

Time 함수와 time_t라는 변수에 대해서

#include 에 정의된 time 함수는 1970년도 1월 1일 0시부터 현재 지금시간까지의 시간을 알수 있는 함수로 time_t time( time_t * timer); 여기서 time_t는 typedef 되어 있다. 정의를 따라가보면 time_t는 typedef __time64_t time_t; /* time value */ 다시 __time64_t를 따라가 보면 typedef __int64 __time64_t; /* 64-bit time value */ 로 정의 되어져있다. 이는 64비트 int형이라는것이다 !!! 이 함수는 구한 time_t형 값을 리턴하기도 하고, 인자로 받은 timer 포인터가 가르키는 변수의 값에 구한 time_t형 값으로 설정한다. 결국 리턴 값과 인자값이 둘다 같은값이기..

strdup 함수 헤더파일은 string.h

이 strdup 함수는 strcpy의 문제점을 해결할수 있다. 그럼 strcpy의 문제점은 무엇인지 부터 알아보겠다. strcpy는 복사할 문자열이 복사될 문자열 공간보다 크면 복사하는도중에 문자열이 짤린다. 하지만 이러한 문제점을 strdup 함수는 해결할수 있다. strdup 함수는 함수내부적으로 malloc함수를 이용하여 메모리를 할당해주고 리턴값을 char*를 리턴함으로서 동적할당의 첫번째 주소를 넘겨준다. strdup()의 원형으로는 char *strdup(const char *string) { char *Data=0; int len = 0; len = strlen()+1; Data = malloc(char*len); return Data; } 이렇게 정의 되어 있을거 같다는 생각이 든다. ma..

전처리기란?

소스파일 -> 전처리기 -> 컴파일러 -> 실행파일 이 순서로 컴퓨터는 처리하는데 사용자가 작성한 프로그램을 실행하기 위해서는 컴파일러로 소스 파일을 실행 파일로 변환해야 하는데 C에서는 컴파일전에 #으로 시작되는 전처리기 지시자 부분을 먼저 처리한다. 이것을 전처리기 (preprocessor)라하고 프로그램에서 사용자 임의로 수식이나 상수를 정의하거나 외부 파일을 삽입하는 등의 작업을 한다. 어떤분은 블로거에서 글을 퍼왔네요 ^^ [출처] 전처리기란??|작성자 김태우 [출처] 전처리기란??|작성자 김태우

#undef 사용 및 정의

#undef는 #define 으로 정의된 매크로를 삭제하고 재 정의할때 사용되는 매크로 이다 . #define TIME 800 #include #undef TIME #define TIME 1400 #include 이예를 보면 TIME이라는 매크로를 800으로 정의하고 ext1.h 파일 에서는 TIME이라는 매크로가 사용되었을때에는 800값이 사용되지만 undef를 이용하여 삭제하고 다시 재 정의를 통해 ext2.h파일에서 1400이라는 값이 사용되게 된다

#ifdef ~ #endif , #ifndef~#endif 정의

#ifdef ~#endif 는 전처리문에서 처리하는 키워드로서 #ifdef 매크로 명 { } #endif 일때 매크로명을 정의해주면 예로 #ifdef START { } #endif 일때 START 매크로가 정의 되어있으면 스코프(블럭 통영범위)영역이 실행될것이며 정의가 되어 있지 않으면 실행되지 않을것이다. 그럼 이젠 #ifndef 에 대해 말해보겠다. #ifndef 매크로명 { } #endif 는 #ifdef 와 다른점은 #ifdef는 정의가 될때마다 실행되는 반면에 #ifndef는 정의되지 않을시에 실행 되고 다음부터는 실행되지 않는다 . 딱 한번밖에 실행되지 않는다는 말이다 ㅎㅎ

#ifndef ~ #endif 와 #pragma once의 차이점

둘다 헤더파일을 한번만 정의할때 사용되는 키워드이다 !! 그런데 이 두개의 차이점은 ? 보통 #pragma once와 #ifndef를 헤더파일 상단에 붙이는데 둘다 헤더파일을 한번만 컴파일 하라는 의미다 차이점은 #pragma는 컴파일러마다 종속적인 사항을 지시하는거라 표준이 아니다 하지만 대부분의 컴파일러들이 지원한다고한다 빌드시 #pragma once를 포함한 헤더파일을 기억해두고 나중에 똑같은 헤더파일을 만나게되면 아예 열어보지도 않고 넘어간다 근데 #ifndef는 언어차원의 표준이다 둘을 비교할때 속도는 #pragma once가 중복된 파일을 만난경우 아예 넘어가므로 약간 빠르다 이것은 오직 인클루드 가드 용도로만 정해져있기 때문이다 하지만 #ifndef는 모든 헤더파일을 열어서 확인하는 방식이다..

메모리 접근 및 캐스팅 문제 !!!

#include double d = 3.14; struct test { int a; double *d; }x={100,&d}; struct test*func(void) { return &x; } void my_test(char a, ...) { printf("%f\n",**(double**)((unsigned char*)&a+4)); printf("%f\n",*(*(struct test**)((unsigned char*)&a+8))->d); printf("%f\n", *((*((struct test* (**) (void))(&a+12)))()->d)) ; } void main(void) { my_test('A',&d,&x,func); } 함수가 호출 되고 매개변수들은 지역변수 임으로 스택에 차곡차곡 채워..