매크로 이름이 상수 크기를 만들지는 않습니다
size_t count = read_count();
#define ITEMS count
/* int values[ITEMS]; : count에 따라 달라지는 길이 */위 코드는 개념 설명이며 완성 프로그램이 아닙니다. 전처리기는 ITEMS를 count로 치환할 뿐 count를 정수 상수식으로 바꾸지 않습니다. 블록에서 런타임 값으로 선언하는 배열은 해당 언어 모드가 지원하면 VLA가 됩니다. C++ 표준 배열 규칙과 GCC의 확장 허용을 같은 것으로 취급하지 않습니다.
GCC의 VLA 설명은 배열 길이를 선언 시점에 계산하고 그 스코프에서 기억한다고 설명합니다. 나중에 count를 바꾸어도 이미 만들어진 배열의 길이가 늘어나지 않습니다. 자동 저장 기간 배열을 쓰는 일반적인 임베디드 빌드에서는 스택 예산과 최악의 길이를 함께 검토해야 합니다.
입력 길이의 의미·유효 범위
길이 × 원소 크기의 넘침
가용 저장 공간과 수명
양수인지 확인했다고 최대 크기까지 확인한 것은 아닙니다
0이나 음수에서 온 잘못된 길이를 거절하고, 큰 양수도 제품의 최대 입력 크기 안에 있는지 확인합니다. signed 값을 size_t로 바꾸기 전의 검사가 필요할 수 있습니다. 바이트 수를 계산할 때는 n > SIZE_MAX / sizeof(element)인지 먼저 확인하는 식으로 곱셈 넘침을 막습니다. 이 검사를 통과했다고 해서 스택에 들어간다고 볼 수는 없습니다.
최대 크기가 작고 정해져 있으면 고정 길이 버퍼와 실제 사용 길이를 분리할 수 있습니다. 큰 입력은 나누어 처리하거나 호출자가 제공한 버퍼를 사용하고, 동적 할당이 허용되는 환경에서는 할당 실패와 해제 책임을 정의합니다. static 버퍼로 바꾸면 재진입·동시 접근 문제가 생길 수 있으므로 저장 위치 변경만으로 해결됐다고 하지 않습니다.
길이 0 배열을 선언했다고 여유 공간이 확보되지는 않습니다
GCC의 0길이 배열 문서에서 길이가 0인 배열은 GNU 확장입니다. 구조체 끝의 payload[0] 관용구와 C99의 payload[] 유연한 배열 멤버를 구분합니다. 후자는 다른 이름 있는 멤버가 있는 구조체의 마지막 멤버로 사용하는 제약이 있습니다. 지역 배열 int a[0]에 원소를 쓸 수 있다는 근거가 아닙니다.
| 표현 | 검토할 경계 |
|---|---|
| int a[n] | 지원 언어 모드, n의 유효성, 자동 저장 공간 |
| 구조체의 payload[0] | GNU 확장과 레이아웃·이식성 |
| 구조체의 payload[] | 유연한 배열 멤버 규칙과 실제 추가 할당 |
유연한 배열 멤버를 선언했다고 해서 뒤쪽 바이트가 할당되지는 않습니다. 구조체 헤더와 payload의 총 크기를 넘침 없이 구하고, 실제 확보한 바이트 안에서 접근해야 합니다. sizeof 구조체에는 패딩이 있을 수 있으므로 길이 0이라는 표현만 보고 전체 객체 크기도 0이라고 추론하지 않습니다.
빌드 조건과 실행 증거
LinkedIn 408 원고에서 잘못 일반화될 수 있는 선언과 경계를 대조했습니다. 실제 컴파일러 버전·언어 옵션·경고와 생성된 스택 사용량을 프로젝트에서 확인해야 합니다. 특정 센서 입력이나 스택 크기를 측정한 결과가 아니며 이 글의 조각 코드를 실행했다고 주장하지 않습니다.
C 런타임과 초기 메모리 배치 · 연속 할당 공간과 단편화
English summary. Macro substitution does not make a variable an integer constant expression. Validate VLA bounds and storage separately. GNU zero-length arrays and C99 flexible array members have different rules; neither declaration allocates arbitrary trailing payload.