null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
가변길이 배열 파라미터 처리
#c
#array
#vla
#parameter
#c99
@devpc
|
2026-05-04 12:40:01
|
GET /api/v1/nodes/454?nv=1
History:
v1 (2026-05-04) (Latest)
0
Views
1
Calls
# 가변길이 배열 파라미터 처리 ## 문제: 배열 크기를 모를 때 배열을 함수에 넘기면 포인터로 전달된다. 크기 정보가 사라진다. ```c void print_arr(int arr[]) { /* sizeof(arr) == sizeof(int*) — 배열 크기가 아님 */ int n = sizeof(arr) / sizeof(arr[0]); /* 틀린 계산 */ } ``` 이 함수 안에서 `sizeof(arr)`는 배열 전체 크기가 아니라 포인터 크기(4 또는 8바이트)를 반환한다. --- ## 해결 1: 크기를 별도 인자로 전달 ```c void print_arr(int *arr, int n) { for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } } int data[5] = {1, 2, 3, 4, 5}; print_arr(data, 5); ``` 가장 기본적이고 C89에서도 동작하는 방법이다. --- ## 해결 2: C99 VLA 파라미터 C99부터 함수 선언에서 배열 크기를 변수로 지정할 수 있다. ```c /* n이 먼저 선언되어야 arr의 크기로 쓸 수 있다 */ void process(int n, int arr[n]) { for (int i = 0; i < n; i++) { arr[i] *= 2; } } int data[5] = {1, 2, 3, 4, 5}; process(5, data); /* data = {2, 4, 6, 8, 10} */ ``` --- ## 2D 배열 파라미터 2D 배열을 함수에 넘기는 방법은 혼란스럽다. ```c /* 컴파일 타임에 열 크기가 고정인 경우 */ void print_matrix(int rows, int mat[][4]) { for (int i = 0; i < rows; i++) { for (int j = 0; j < 4; j++) { printf("%d ", mat[i][j]); } printf("\n"); } } /* C99 VLA 버전: 행·열 모두 동적 */ void print_matrix_vla(int rows, int cols, int mat[rows][cols]) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", mat[i][j]); } printf("\n"); } } ``` --- ## 임베디드에서의 VLA 주의점 C99 VLA는 스택에 런타임 크기 배열을 할당한다. ```c void func(int n) { int buf[n]; /* 스택에 n * sizeof(int) 바이트 할당 */ } ``` MCU에서 n이 커지면 스택 오버플로가 발생한다. MISRA C 2012는 VLA 사용을 금지(Rule 18.8)한다. 임베디드 프로젝트에서는 보통 고정 크기 배열을 쓴다. --- ## 안전한 대안 ```c #define MAX_N 64 void safe_process(int *arr, int n) { if (n > MAX_N) n = MAX_N; /* 크기 제한 */ for (int i = 0; i < n; i++) { arr[i] *= 2; } } ``` 최대 크기를 `#define`으로 고정하고 런타임 체크로 초과를 방지한다.
// COMMENTS
Newest First
ON THIS PAGE