묻공러
'C' 카테고리의 글 목록 (2 Page)

C

C/[코드조선] C 핵심

[C] 버퍼, 버퍼링

버퍼, 버퍼링 버퍼는 경계선을 넘어서 데이터를 주고 받을 때 데이터를 주고 받는 것 자체가 (여기서 경계선이란 컴퓨터와 인터넷의 사이를 의미한다) 로컬 PC에서 주고 받는 것과 비교했을 때 현저하게 느리다 따라서 한 번 보낼 때 한꺼번에 최대한 많이 보내는 것이, 한 번 받을 때도 한꺼번에 최대한 많이 받는것이 효율적이다 즉, 버퍼 개념을 통해 쌓아두었다가 보낼 수 있을 때 최대한 많이 보내는 것이다 이를 무선 공유기에서는 버퍼의 크기를 직접 설정할 수도 있다 #include #include #define BUFFER_LENGTH (32) static size_t s_buffer_index = 0u; static char s_buffer[BUFFER_LENGTH]; void buffered_print(c..

C/[코드조선] C 핵심

[C] 구조체 복사

얕은 복사(Shallow Copy) 실제 데이터가 아니라, 주소만 복사되는 것을 얕은 복사라고 한다 변수명만 다르고, 같은 주소를 공유하고 있는 상태이다 깊은 복사(Deep Copy) 서로 다른 메모리 주소를 가지면서 해당 메모리 주소에 적힌 값은 같은 상태이다 구조체 멤버에 배열 vs. 포인터

C/[코드조선] C 핵심

[C] typedef

typedef type definition의 약자이다 이미 정의되어 있는 자료형에 새로운 별명을 지어주는 것이다 컴파일러 및 플랫폼에 따라 size_t 자료형의 정의가 다르지만 일반적으로 typedef unsigned long size_t; 로 size_t 자료형도 typedef 된 것이다 _t가 접미사로 붙으면 typedef 된 것을 의미한다 typedef 사용 예시 1 typedef int INT int a = 1; INT b = 2; typedef 사용 예시 2 (구조체) #include struct Date { size_t Year; size_t Month; size_t Day; }; typedef struct Date Date_t; int main(void) { Date_t Today; retu..

C/[코드조선] C 핵심

[C] 동적 할당

동적 할당의 처리 단계 C언어에서는 프로그래머가 직접 메모리 동적 할당받고 사용 후 반드시 해제를 해야 한다 1. 메모리 할당 힙 메모리 관리자(OS에서 제공)에게 원하는 메모리 바이트만큼 요청하고 힙 메모리 관리자는 해당 크기의 연속된 메모리의 시작 주소를 반환한 2. 메모리 사용 할당된 힙 메모리 시작 주소를 가지고 원하는 작업을 수행한다 3. 메모리 해제 힙 메모리 관리자에게 해당 메모리 주소를 돌려주면서 다 썼다고 알린다 힙 메모리 관리자는 해당 메모리를 점유되지 않은 메모리 상태로 바꾼다 메모리 주소를 돌려주지 않으면 해당 메모리를 계속 점유하고 있는 상태가 되며, 메모리 누수(Memory leak)가 발생한다 동적 메모리 관련 함수 할당: malloc() / calloc() 재할당: reall..

C/[코드조선] C 핵심

[C] 메모리 구조

메모리 구조 메모리 구조는 크게 스택 메모리, 힙 메모리, 코드섹션, 데이터섹션으로 나뉜다 코드섹션 코드 섹션은 프로그래머가 작성한 소스코드들이 저장되는 곳이다 데이터섹션 데이터섹션은 전역 변수와 정적 변수 등이 저장되는 곳이다 총 3가지로 구분된다 1. Initialized Data Section (초기화된 데이터 영역) 초기값을 가지는 전역 변수 및 정적 변수가 저장된다 2. Uninitialized Data Section (BSS 섹션, 초기화되지 않은 데이터 영역) 초기값을 가지지 않는 전역 변수 및 정적 변수가 저장된다 프로그램 실행 시 이 영역의 변수들은 0 또는 NULL과 같은 기본값으로 초기화된다 3. Read-Only Data Section (상수 데이터 영역 또는 Const Data S..

C/[코드조선] C 핵심

[C] 문자열 정렬

문자열 정렬 2차원 문자 배열을 사전순 기준으로 오름차순과 내림차순 정렬을 구현하는 예시이다 stdlib.h의 qsort() 함수를 활용해서 풀 수 있으며, qsort()는 콜백 함수 관련이 있다 #include #include #include enum { WORDS_LENGTH = 6 }; int compare_words(const void* lhs, const void* rhs); int compare_words_desc(const void* lhs, const void* rhs); int main(void) { size_t i; const char* words[WORDS_LENGTH] = { "premium", "level", "cultured", "moaning", "skinny", "curve"..

C/[코드조선] C 핵심

[C] strrev()

strrev() 인자로 전달받은 str 문자열의 순서를 뒤집어서 반환하는 함수이다 strrev() 구현 #include enum { LENGTH = 16 }; size_t my_strlen(const char* str); char* my_strrev(char* str); int main(void) { char string[LENGTH] = "11-40-2202"; printf("%s\n", string); my_strrev(string); printf("%s\n", string); return 0; } size_t my_strlen(const char* str) { size_t i; for (i = 0; *str++ != '\0'; ++i) {} return i; } char* my_strrev(char..

C/[코드조선] C 핵심

[C] strtolower(), strtoupper()

strtolower(), strtoupper() 대소문자를 변경하는 함수로 코딩 테스트에서 자주 등장한다 전달 받은 문자열을 모두 소문자, 혹은 모두 대문자로 바꾸는 함수이다 strtolower(), strtoupper() 구현 #include #include int is_alpha(int c); int to_upper(int c); int to_lower(int c); void string_toupper(char* str); void string_tolower(char* str); int main(void) { char str[15] = "Welcome to C"; printf("Is space alphabet?: %s\n", is_alpha(' ') ? "Yes" : "No"); printf("m i..

C/[코드조선] C 핵심

[C] strcat(), strstr(), strtok()

strcat() dst 문자열 뒤에 src 문자열을 덧붙인다 dst 문자열의 NULL 캐릭터가 있는 위치부터 src 문자열을 추가한다 따라서, dst의 크기가 충분하지 않다면 위험한 함수이다 strcat() 사용예시 #include #include #define LENGTH (20) int main(void) { char string1[LENGTH] = "Hello, "; char string2[LENGTH / 2] = "Hello, "; const char* string3 = "world!"; printf("sizeof(string1): %zu\n", sizeof(string1)); printf("sizeof(string2): %zu\n", sizeof(string2)); printf("sizeof(s..

C/[코드조선] C 핵심

[C] strcpy()

strcpy() vs. strncpy() - strcpy() strcpy 함수는 널 종단 문자 ('\0')를 만날 때까지 src 문자열의 전체 문자를 dst 문자열로 복사한다 만약 src 문자열의 길이가 dst 문자열의 버퍼 크기보다 크면, 버퍼 오버플로우가 발생할 수 있다 strcpy는 보통 null 종단 문자를 복사하지 않아도 되는 경우에 사용한다 - strncpy() strncpy 함수는 두 번째 매개변수로 지정된 길이까지만 src 문자열을 dst 문자열로 복사한다 만약 src 문자열의 길이가 두 번째 매개변수로 지정한 길이보다 크면, 나머지는 null 종단 문자로 채워지지 않는다 명시적으로 지정된 길이까지만 복사하며 나머지는 null 종단 문자로 채우지 않기 때문에, 버퍼 오버플로우를 방지하는 데..