본문 바로가기

프로그래밍/C72

C ] 빅엔디안 리틀엔디안 변환함수 구현 + 매크로 함수 작성시 주의점 htons(), htonl(), ntohs(), ntohl() 함수를 쓰지 않고 직접 구현하기 #include #define uint16_t unsigned short #define uint32_t unsigned int #define SWAP_UINT16(x) ((uint16_t)((((x) & 0xff00) >> 8) | (((x) & 0x00ff) > 24) | (((x) & 0x00ff0000) >> 8) | (((x) & 0x0000ff00) 8) & 0x00ff) + (((x) & 0x00ff) 2022. 10. 22.
C ] memset 함수 구현 void *my_memset(void *s, int c, int len) { unsigned char *p = (unsigned char *)s; while (len > 0) { *p = c; p++; len--; } return (s); } #include void *my_memset(void *s, int c, int len) { unsigned char *p = (unsigned char *)s; while (len > 0) { *p = c; p++; len--; } return (s); } int main() { char str[13] = "hello world!"; for (int i = 0; str[i] != '\0'; i++) { printf("%c", str[i]); } printf("\n.. 2022. 10. 9.
C, Linux ] pthread 사용해 보기 pthread 사용해 보기#include #include #include #include #include void *thread1_func (void *vargp){ unsigned short cnt=0; printf("Thread 1 function starts...\n"); while(1) { sleep(1); printf("thread1_func is running ===>(%d)\n", cnt++); }}void *thread2_func (void *vargp){ unsigned short cnt=0; printf("Thread 2 function start.. 2022. 8. 25.
C ] 명령 프롬프트 구현 (함수포인터 사용) #include #include /* for strcmp() strlen*/ //#include /* for usleep() */ #include #include // argv MAX #define MAX_CMD_NUM 10 // string MAX #define BUF_LEN 128 int cmd_continue = 0; typedef int cmd_func(int argc, char* argv[]); struct Command_List { char* cmd; cmd_func* func; char* help_str; }; int cmd_test1(int argc, char* argv[]) { if (argv[1] == NULL) { printf("test 1 command received. \n"); .. 2022. 8. 25.
C ] 전처리기 (Preprocessor) 전처리기(preprocessor)는 프로그램을 컴파일할 때 컴파일 직전에 실행되는 것으로, 전처리기가 실행되면 각 코드 파일에서 #으로 시작하는 지시자(directives)를 찾는다. #include 지정된 파일을 그 위치에 복사, 파일을 포함시키기 위해 사용한다. Current directory 에서 먼저 찾고 그 다음 표준 라이브러리에서 찾음 // 표준 라이브러리 #include // 사용자가 정의한 파일 #include "filename" #define 심볼릭 상수나 매크로를 생성할 때 사용. 컴파일 시 텍스트로 대체됨. 매크로 사용의 장점은 코딩 오버헤드를 줄여줌. #define PI 3.141592 #define CIRCLE_AREA( x ) ( (PI) * ( x ) * ( x ) ) #def.. 2022. 8. 24.
C, Linux ] ls 명령어 구현 리눅스의 ls 명령어 구현하기 #include #include // 디렉터리 관련 DIR, struct dirent, opendir(), readdir(), closedir() 등이 정의된 헤더 포함 #include // Unix 에 쓰이는 표준 심볼들과 상수, 함수들이 정의된 헤더 포함 #include int main(int argc, char* argv[]) { // cwd에 1024 byte 동적할당 char * cwd = (char *)malloc(sizeof(char) * 1024); // DIR 과 dirent 구조체 포인터를 만들고 일단 NULL 대입 DIR * dir = NULL; struct dirent * entry = NULL; // 추가 인자 없이 실행된 경우 if(argc==1){.. 2022. 8. 17.
C, Linux ] main 함수의 매개변수 사용해서 파일 입출력 하기 main 함수에 전달되는 파라미터를 활용해 코드를 짤 때는 아래와 같이 출력해 디버깅 해보면 편하다. for(int i=0; i< argc; i++){ printf("%s\n",argv[i]); } 1. main 함수의 argument 로 파일이름과 파일에 저장할 문자열을 입력받아 파일을 생성하는 프로그램 #include #include #include int main(int argc, char *argv[]){ /* for(int i=0; i< argc; i++){ printf("%s\n",argv[i]); } */ if (argc < 3) { printf("Usage: fileio.exe "); return 0; } FILE *fp; fp = fopen(argv[1], "w"); if(fp==NULL.. 2022. 8. 17.
C ] 가변인자 함수 만들기, 가변인자 출력함수 만들기 printf() 함수의 경우 내가 원하는 만큼 인자를 넘길 수있다. 예를 들면 printf("%d", a);// 인자 2개 printf("%d %d", a, b);// 인자 3개 이게 가능한 이유는 printf()가 매개변수의 개수가 정해지지 않은 가변인자 함수이기 때문이다. 가변인자 함수로 인자의 개수와 상관없이 정수형 인자를 여러개 받아서 인자 모두를 더한 값을 반환하는 함수를 만들어보도록 하겠다. #include // stdarg.h 포함. va_list, va_start, va_arg, va_end가 정의된 헤더 파일 #include int sum(int num_args, ...) { // 가변 인자의 개수를 받음, ...로 가변 인자 설정 va_list ap;// 가변 인자 목록 포인터 va_s.. 2022. 8. 12.
[ Visual Studio ] CRT 라이브러리로 메모리 누수 탐지하기 Visual Studio에서 CRT 라이브러리를 사용해 메모리 누수 탐지하는 방법 1. 소스 상단에 아래 지시문을 포함한다. #define _CRTDBG_MAP_ALLOC #include #include 2. 종료지점 직전에 아래 코드를 추가한다. _CrtDumpMemoryLeaks(); 3. F5를 눌러 디버그 모드로 실행 후 종료한다. 테스트를 위해 어떤 함수안의 free를 주석처리하고 디버그 모드로 실행한 뒤 그 함수를 호출하고 종료해보았다. 아래와 같이 메모리 누수가 감지되었다고 뜬다. 나는 테스트해본거라 어느위치에서 누수가 된건지 알고있지만 모르겠다면 4. 메인함수 안쪽 상단에 아래 코드를 넣고 매개변수로는 위에서 본 번호인 111을 넣은 뒤 디버그 모드로 다시 실행한다. _CrtSetBreak.. 2022. 5. 2.
[ C언어 ] realloc은 얼마나 자주 메모리 주소를 옮길까? realloc함수에 대한 설명을 찾아보면 다음과 같은 과정으로 작동한다고 한다. 1. 동적할당된 메모리 크기를 변경해 재할당함 (기존 주소일수도 있고, 새로운 주소일 수도 있음) 2. (새로운 주소에 할당한 경우) 기존 주소에 있던 값을 새로운 주소에 복사하고 원래 주소는 할당해제함 얼마나 많이 메모리 주소를 옮겨갈까 궁금해서 아래 코드로 테스트를 해보았다. #define _CRTDBG_MAP_ALLOC #include #include #include #include int main(void) { int arraysize = 10; int i = 0; char* test = (char*)malloc(sizeof(char) * arraysize); int plus = 10; float chk = 0; fo.. 2022. 5. 2.