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
포인터로 Swap 구현하기
7 / 17
strlen을 직접 짜면
☆ Star
↗ Full
배열 복사 — memcpy vs 루프 비교
#c
#array
#memcpy
#memory
#pointer
@devpc
|
2026-05-04 12:40:00
|
GET /api/v1/flows/25/nodes/447?fv=1&nv=1
Context:
Flow v1
→
Node v1
0
Views
1
Calls
# 배열 복사 — memcpy vs 루프 비교 ## 세 가지 복사 방법 C에서 배열을 복사하는 방법은 세 가지다. 어떤 상황에서 무엇을 쓸지 알아야 한다. --- ## 방법 1: 루프 복사 ```c #define N 16 int src[N] = {1, 2, 3, 4, 5}; int dst[N]; for (int i = 0; i < N; i++) { dst[i] = src[i]; } ``` 단순하고 명확하다. 복사 조건이 필요할 때(필터링, 변환 등) 유용하다. --- ## 방법 2: memcpy ```c #include <string.h> memcpy(dst, src, sizeof(int) * N); /* 또는 */ memcpy(dst, src, sizeof(dst)); /* dst가 배열이면 전체 크기 */ ``` **바이트 단위**로 복사한다. `sizeof(int) * N` 바이트를 src에서 dst로 옮긴다. --- ## 방법 3: 포인터 복사 ```c int *p = src; int *q = dst; int n = N; while (n--) *q++ = *p++; ``` 루프와 동일하지만 포인터 산술로 인덱스를 없앤 형태다. 현대 컴파일러에서는 루프와 거의 동일한 코드를 생성한다. --- ## memcpy가 빠른 이유 `memcpy`는 플랫폼별로 최적화된 구현을 쓴다. - x86/ARM에서 SIMD 명령어(SSE, NEON) 사용 - 워드 정렬(4/8바이트) 단위로 처리 - 작은 크기는 인라인으로 처리 MCU(ARM Cortex-M)에서도 `memcpy`가 루프보다 빠른 경우가 많다. --- ## 올바른 사용법과 주의점 ```c /* 주의 1: 크기 계산 오류 */ memcpy(dst, src, N); /* 틀림 — N개가 아니라 N 바이트 */ memcpy(dst, src, sizeof(int) * N); /* 올바름 */ /* 주의 2: 겹치는 영역 */ int arr[10] = {1,2,3,4,5,6,7,8,9,10}; memcpy(arr + 2, arr, sizeof(int) * 5); /* 위험! 겹침 */ memmove(arr + 2, arr, sizeof(int) * 5); /* 안전 — 겹침 허용 */ /* 주의 3: dst 크기 초과 */ char small[4]; memcpy(small, "Hello World", 11); /* 버퍼 오버플로 */ ``` **겹치는 메모리 영역을 복사할 때는 `memmove`를 써야 한다.** `memcpy`는 겹침이 없다고 가정하고 최적화하기 때문이다. --- ## 성능 비교 요약 | 방법 | 속도 | 코드 | 겹침 처리 | |------|------|------|----------| | 루프 | 보통 | 명확 | O (조건 추가) | | memcpy | 빠름 | 간결 | ❌ (memmove 필요) | | 포인터 | 보통~빠름 | 난해 | ❌ | 대부분의 상황에서 `memcpy`가 정답이다. 겹침이 있으면 `memmove`, 조건부 복사가 필요하면 루프를 쓴다.
포인터로 Swap 구현하기
strlen을 직접 짜면
// COMMENTS
Newest First
ON THIS PAGE
No content selected.