null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
C언어 실전 코드 패턴
Structure
struct
•
구조체 배열 선언과 초기화
•
구조체 포인터 접근하는 법
•
Swap 함수를 구조체에 적용하기
•
연결리스트 삽입·삭제·정렬
memory-pointer
•
malloc·free 사용 패턴
•
포인터로 Swap 구현하기
•
배열 복사 — memcpy vs 루프 비교
string-impl
•
strlen을 직접 짜면
•
strcpy를 직접 짜면
•
strcat·strcmp 구현과 안전한 대안
const-module
•
const 올바른 사용법
•
.h 파일과 .c 파일 역할 구분
•
파일 입출력 패턴
practical-tricks
•
가변길이 배열 파라미터 처리
•
!! 이중 부정 연산자
•
Windows 소켓 에러 모음
•
미니 프로젝트 — 영타 연습기 만들기
Flow Structure
연결리스트 삽입·삭제·정렬
5 / 17
포인터로 Swap 구현하기
☆ Star
↗ Full
malloc·free 사용 패턴
#c
#malloc
#free
#memory
#heap
@devpc
|
2026-05-04 12:40:00
|
GET /api/v1/flows/25/nodes/445?fv=1&nv=1
Context:
Flow v1
→
Node v1
0
Views
1
Calls
# malloc·free 사용 패턴 ## 스택과 힙의 차이 ``` 스택 (Stack): - 함수 호출 시 자동 할당·해제 - 크기 제한 (MCU: 수 KB ~ 수십 KB) - 빠름 힙 (Heap): - malloc/free로 수동 관리 - 더 큰 데이터 할당 가능 - 단편화 위험 ``` --- ## 기본 패턴 ```c #include <stdlib.h> #include <string.h> /* 단일 구조체 할당 */ typedef struct { int id; float val; } Record; Record *create_record(int id, float val) { Record *r = (Record *)malloc(sizeof(Record)); if (!r) return NULL; /* 반드시 NULL 체크 */ r->id = id; r->val = val; return r; } void destroy_record(Record **r) { if (r && *r) { free(*r); *r = NULL; /* 댕글링 포인터 방지 */ } } ``` `free` 후 포인터를 `NULL`로 세팅하는 것은 습관으로 만들어야 한다. 두 번 `free` 했을 때 크래시를 막아준다. --- ## 배열 동적 할당 ```c /* n개 원소 배열 */ int *arr = (int *)malloc(sizeof(int) * n); if (!arr) return -1; for (int i = 0; i < n; i++) arr[i] = i; free(arr); arr = NULL; ``` ### calloc: 0으로 초기화 ```c /* malloc + memset(0)과 동일 */ int *arr = (int *)calloc(n, sizeof(int)); ``` 정수 배열 초기화에는 `calloc`이 편리하다. ### realloc: 크기 변경 ```c int *arr = (int *)malloc(sizeof(int) * 4); /* ... */ /* 8개로 확장 */ int *tmp = (int *)realloc(arr, sizeof(int) * 8); if (!tmp) { free(arr); /* realloc 실패 시 원본 해제 */ return -1; } arr = tmp; ``` `realloc`의 반환값을 바로 원본에 대입하면 실패 시 원본 포인터를 잃는다. 반드시 임시 변수로 받는다. --- ## 메모리 누수 패턴 ```c /* 누수 1: 분기에서 free 누락 */ void bad_func(int cond) { char *buf = malloc(128); if (cond) return; /* buf 누수! */ free(buf); } /* 수정 */ void good_func(int cond) { char *buf = malloc(128); if (cond) { free(buf); return; } free(buf); } /* 누수 2: 재할당 전 free 누락 */ char *p = malloc(64); p = malloc(128); /* 이전 64바이트 누수 */ /* 수정 */ free(p); p = malloc(128); ``` --- ## 임베디드에서의 malloc 사용 지침 | 상황 | 권장 | |------|------| | 초기화 시 1회 할당 | OK | | 실행 중 반복 할당·해제 | 피할 것 (단편화) | | RTOS 태스크 스택 | RTOS API 사용 | | 고정 크기 오브젝트 | Static pool 사용 | AUTOSAR 기반 프로젝트에서는 일반적으로 런타임 `malloc`을 금지하고 정적 할당만 허용한다.
연결리스트 삽입·삭제·정렬
포인터로 Swap 구현하기
// COMMENTS
Newest First
ON THIS PAGE
No content selected.