메모리 구조 메모리 구조는 크게 스택 메모리, 힙 메모리, 코드섹션, 데이터섹션으로 나뉜다 코드섹션 코드 섹션은 프로그래머가 작성한 소스코드들이 저장되는 곳이다 데이터섹션 데이터섹션은 전역 변수와 정적 변수 등이 저장되는 곳이다 총 3가지로 구분된다 1. Initialized Data Section (초기화된 데이터 영역) 초기값을 가지는 전역 변수 및 정적 변수가 저장된다 2. Uninitialized Data Section (BSS 섹션, 초기화되지 않은 데이터 영역) 초기값을 가지지 않는 전역 변수 및 정적 변수가 저장된다 프로그램 실행 시 이 영역의 변수들은 0 또는 NULL과 같은 기본값으로 초기화된다 3. Read-Only Data Section (상수 데이터 영역 또는 Const Data S..
문자열 정렬 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"..
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..
strcpy() vs. strncpy() - strcpy() strcpy 함수는 널 종단 문자 ('\0')를 만날 때까지 src 문자열의 전체 문자를 dst 문자열로 복사한다 만약 src 문자열의 길이가 dst 문자열의 버퍼 크기보다 크면, 버퍼 오버플로우가 발생할 수 있다 strcpy는 보통 null 종단 문자를 복사하지 않아도 되는 경우에 사용한다 - strncpy() strncpy 함수는 두 번째 매개변수로 지정된 길이까지만 src 문자열을 dst 문자열로 복사한다 만약 src 문자열의 길이가 두 번째 매개변수로 지정한 길이보다 크면, 나머지는 null 종단 문자로 채워지지 않는다 명시적으로 지정된 길이까지만 복사하며 나머지는 null 종단 문자로 채우지 않기 때문에, 버퍼 오버플로우를 방지하는 데..
strcmp() vs. strncmp() vs. int strncmp() - strcmp() strcmp 함수는 두 문자열을 비교하여 동일한지 여부를 확인한다 비교할 두 문자열이 완전히 동일하면 0을 반환하고, 첫 번째로 다른 문자의 ASCII 값에 따라 음수 또는 양수를 반환한다 - strncmp() strncmp 함수는 두 문자열 중에서 처음부터 n개의 문자까지 만을 비교한다 두 문자열이 동일한 경우 0을 반환하고, 동일하지 않은 경우 두 문자열의 첫 번째 다른 문자의 ASCII 값에 따라 음수 또는 양수를 반환합니다. strncmp은 주로 특정 길이만큼의 문자열을 비교할 때 사용된다 - int strncmp() int strncmp은 반환 값이 int로 명시되어 있는 strncmp 함수이다 strn..
strlen() vs. strnlen() vs. strnlen_s() - strlen() strlen 함수는 null 종단 문자('\0')가 나타나기 전까지의 문자열 길이를 측정한다 하지만 null 종단 문자 이후의 메모리를 읽기 시작할 경우, undefined behaviour를 초래할 수 있다 - strnlen() strnlen 함수는 첫 번째 매개변수로 전달된 문자열에서 최대한으로 지정된 길이까지만 검사한다 null 종단 문자 이전에 지정된 최대 길이에 도달하면 검사를 중단하고 그때까지의 길이를 반환한다 strnlen은 C99 표준에서 도입되었고 많은 C 라이브러리에서 사용 가능하다 - strnlen_s() strnlen_s는 C11 표준에서 도입된 안전한 함수로 strnlen의 개선버전이다 추가적..
참조 vs. 역참조 참조: 포인터를 의미하며, 변수의 값을 직접 다 들고 있는 게 아니라, 메모리 주소를 읽는 것 역참조: 변수의 값을 직접 읽는 것이 아니라, 메모리 주소를 통해 타고 가서 값을 읽는 것 // 직접 접근 int score = 100; score = 50; // 간접 접근 int score = 100; int* ptr_to_score = &score; // 포인터를 통해 참조 *ptr_to_score = 50; // 역 참조 연산자(*)를 통해 역참조 NULL 포인터 NULL 포인터는 아래와 같은 경우에 사용한다 1. 포인터의 초기화 2. 포인터가 더이상 사용 중이지 않음을 알리고 싶을 때 ptr = NULL; 3. 포인터가 유효한 메모리 주소를 참조하고 있는지 확인할 때 if (NULL..
재귀 함수(Resurcive Function) 함수 내에서 자기 자신을 호출하는 함수를 의미한다 #include void recur(int count); int main(void) { recur(3); return 0; } void recur(int count) { printf("%d\n", count); if (1 == count) { return; } recur(count - 1); } 재귀 함수의 핵심 재귀 함수 속 return의 위치와 재귀 함수 속 함수가 호출되는 위치가 매우 중요하다 다시 말해, 재귀 함수 속 return의 위아래로 어떤 코드를 작성하느냐, 함수 호출 위 아래로 어떤 코드를 작성하느냐에 따라 결과물이 달라진다 #include void recur(int count); int ma..