c
-
[번역/요약] C언어 메모리 부족(OOM) 상황 처리 방법Programming/번역&요약 2024. 11. 24. 19:18
Eli Bendersky의 'Handling Out of Memory Conditions in C' 글을 번역하고 정리했습니다. C언어에서 malloc이 실패하는 OOM 상황의 세 가지 처리 정책(복구/중단/Segfault)과 Glib, SQLite, Git 등 실제 프로젝트들의 구현 사례를 살펴봅니다."원문: Handling Out of Memory Conditions in C서론malloc 함수의 반환값 0(NULL)은 메모리 할당 실패(Out of Memory, OOM)를 의미함애플리케이션은 이를 발견하고 적절하게 "처리"해야 하나, 어떻게 처리해야 하는지는 명확하지 않음글은 실제 자주 사용되는 OOM 처리 방법들을 분석하고 통찰을 제공하고자 함OOM 처리 방법에 "정답"이란 없으며, 글은 임베디드..
-
C언어로 알아보는 객체 지향 프로그래밍: 가상 함수 테이블(vtable)과 메서드 구현Programming/TIL 2024. 11. 23. 22:43
C언어로 구조체와 함수 포인터를 이용해 객체 지향 프로그래밍을 구현하는 방법을 설명합니다. 객체 지향 언어의 메서드를 모방하고, 가상 함수 테이블(vtable)을 이용한 동적 함수 호출을 구현하는 과정을 다룹니다. C++의 정적/동적 바인딩, Java의 추상 메서드 등 다양한 언어의 메서드/인터페이스 구현 방식과 비교하며 객체 지향의 원리를 설명합니다.개요요전에 제어의 역전(Inversion of Control) 이해하기 1부: 객체 지향 이전의 C언어 구현이라는 글을 썼습니다.2부는 "객체 지향 프로그래밍에서의 제어의 역전"을 설명할 계획이었는데요.글의 내용을 고민하던 와중, 이걸 객체 지향 언어 대신 C언어로 설명해 볼 순 없을까?라는 생각이 들었습니다.그런데 글을 쓰다 보니 내용이 점점 산으로 가고..
-
제어의 역전(Inversion of Control) 이해하기 1부: 객체 지향 이전의 C언어 구현Programming/TIL 2024. 11. 7. 22:56
C언어의 함수 포인터를 활용하여 제어의 역전(IoC, Inversion of Control)의 기본 개념과 구현 방법을 설명합니다.Spring이나 객체 지향 프로그래밍의 고급 개념 없이, C언어의 qsort() 함수 예제를 통해 콜백 메커니즘의 동작 원리와 장점을 살펴봅니다. 함수 포인터를 활용한 코드 결합도 낮추기와 재사용성 향상 방법을 다룹니다.개요최근 너무 흥미로운 블로그 글을 발견했습니다.제어의 역전을 C언어 예시로 설명하고, 이를 객체 지향적 관점으로 확장하며 설명하는 글이었는데요.읽으면서 이해한 내용을 정리하고, 글 소개도 할 겸 글을 써보기로 했습니다.본 글은 해당 블로그 글을 기반으로 제어의 역전을 설명합니다.설명과 코드 예시는 블로그 글을 참고하되, 최대한 이해하기 쉽도록 제 나름의 설명..
-
C언어에서의 다차원 데이터 메모리 할당 방법Programming/TIL 2024. 10. 16. 01:02
C언어에서 다차원 데이터, 혹은 다차원 배열의 메모리 동적 할당 방법을 다룹니다.터를 이용한 기초적인 방법부터, 일차원으로 메모리를 할당하는 선형 방식, 선형 데이터에 이차원 배열의 인터페이스([][])를 사용하는 방법, VLA(Variable Length Array)를 사용하는 방법 등 각 방식의 장단점을 이차원 데이터를 할당하는 예시 코드와 함께 설명합니다.개요프로그래밍을 하다 보면 2차원 이상의 데이터 구조를 다뤄야 할 때가 있습니다.게임의 맵 정보나 픽셀로 이루어진 이미지 데이터, 행렬과 테이블 데이터 등이 대표적입니다.이런 다차원 데이터는 컴파일 시점에 크기를 알 수 없는 경우가 많습니다.게임 맵 크기가 실행 중에 결정되거나, 처리할 이미지의 해상도를 사전에 알지 못하는 경우가 대표적이죠.이럴 ..
-
배열과 포인터의 차이Programming/TIL 2024. 8. 27. 05:09
C언어에서 배열과 포인터의 차이점을 상세히 설명합니다.2차원 배열을 이중 포인터로 전달할 때 발생하는 문제와 배열 붕괴(decay) 현상을 통해, 배열과 포인터가 실제로는 다른 개념임을 설명합니다.Intro배열을 포인터로 넘겨주기가로 x 세로 크기 2차원 퍼즐 게임을 만든다고 해봅시다. 일단 아래와 같이 18줄 정도 코드를 작성했습니다.struct puzzle{ int n_rows; int n_cols; int **board;};void print_puzzle(struct puzzle *p){ for (int i = 0; i n_rows; i++) { for (int j = 0; j n_cols; j++) { printf("%d ",..
-
백준 7562번 나이트의 이동: C언어 풀이Programming/PS 2024. 2. 28. 02:40
백준 7562 나이트의 이동 문제의 C언어 해설입니다.일반적인 BFS 구현에서 시작해, 체스판 크기를 조작해 실행 시간을 최적화 하는 과정을 단계적으로 설명합니다.기본 접근: BFS를 이용한 나이트의 이동 구현나이트의 처음 시작 포지션을 큐에 넣는다. 움직일 수 있는 8가지 경우의 수에 대해 BFS를 돌려준다.목표 지점에 도달하기까지의 소요 시간은 매 iteration 마다 큐의 크기 만큼만 pop 하는 것으로 계산할 수 있다. 구현 코드#include #define MAX_BOARD_SIZE 300#define VISITED 1struct position{ short row, col;};struct board{ int cells[MAX_BOARD_SIZE][MAX_BOARD_SIZE]; ..
-
백준 이항 계수 시리즈 풀이 (이항 계수 2, 이항 계수3, 이항 계수와 쿼리)Programming/PS 2024. 2. 27. 00:53
백준 11051번 이항 계수 2, 11401번 이항 계수 3, 13977번 이항 계수와 쿼리 문제에 대한 C언어 해설입니다.페르마의 소정리로 모듈러 곱셈 역원을 구하고, 거듭제곱을 최적화하여 큰 수의 이항 계수를 효율적으로 계산하는 방법을 단계적으로 설명합니다.11051 이항 계수 2백준 11051번 이항 계수 2자료 구조 말고 다른 유형도 풀어볼까 하다가 마주친 문제 문제를 풀기 위해서 이항 계수의 정의에 따라 다음을 계산해야 한다.${n \choose k} = \frac{n!}{r!(n-r)!}$문제는 입력 결과값이 엄청 크다는 것이다.n = 1000, k = 500 일때 결과값만 해도 $10^{299}$ 를 넘는다.C의 unsigned long long 값, $2^{64}- 1$ 을 아득히 초월하..
-
백준 9934번 완전 이진 트리: C언어 풀이Programming/PS 2023. 10. 25. 17:39
백준 9934 완전 이진 트리 문제의 C언어 해설입니다.트리를 직접 구현하는 방법 대신, 중위 순회 결과가 저장된 배열에서 층별 순회 결과를 수학적으로 도출하여 해결하는 방법을 설명합니다.전략트리 만들지 않기트리를 구성해서 bfs를 하면 간단한 문제이다.근데 그냥 빌딩 번호가 저장된 배열을 층별 순회 순서대로 출력하면 더 간단하지 않을까?중위 순회 순서대로 저장된 배열을 층별로 읽을 수 있는 어떤 적절한 규칙이 분명 있을 것이다 라고 생각했다.그렇게 노트랑 팬 들고 삽질하면서 다음 규칙을 찾았다.level 3의 첫 번째 노드 왼쪽에는 깊이가 2인 포화 이진 트리가 존재한다.level 3의 각 노드 사이에는 깊이가 3인 포화 이진 트리가 존재한다. 중위 순회 결과는 왼쪽부터 순서대로 배열에 저장되어 있다..