i <= N이 왜 위험한지(무슨 일이 덮어써지는지) 설명할 수 있다.monsterHp1, monsterHp2… 처럼 변수를 늘리는 건 사실상 불가능합니다.| 항목 | 설명 |
|---|---|
| 정의 | 동일한 데이터 타입의 값을 연속된 메모리 공간에 저장하는 자료구조 |
| 인덱스 | 0부터 시작. 최대 인덱스 = 배열 크기 - 1 |
| 크기 | 선언 시 고정. 이후 변경 불가 |
| 메모리 | 선언 시 크기만큼 연속적으로 책장처럼 이어붙여 할당됨 |
예: int arr[5]; 는 메모리에 이런 느낌으로 연속 배치됩니다.
arr[0] arr[1] arr[2] arr[3] arr[4]
┌─────┬─────┬─────┬─────┬─────┐
│ ? │ ? │ ? │ ? │ ? │ (초기화 안 하면 쓰레기 값일 수 있음)
└─────┴─────┴─────┴─────┴─────┘
타입 배열이름[크기];
int arr[10]; → int 타입의 10칸짜리 배열. 배열 이름은 arr.int 타입의 배열이다 → 타입과 이름, 크기를 함께 봐야 함.arr[0], arr[1], ... arr[9]. 인덱스는 0부터 시작.| 방법 | 예시 |
|---|---|
| 선언만 | int arr[10]; → 쓰레기값 |
| 전체 초기화 | int arr[5] = {1, 2, 3, 4, 5}; |
| 일부만 초기화 | int arr[10] = {1, 2, 3}; → 나머지 7개는 0 |
| 반복문으로 초기화 | for (int i = 0; i < 5; i++) arr[i] = i * 10; |
| 크기 생략 | int arr[] = {1, 2, 3, 4, 5}; → 컴파일러가 5로 추론 |
#include <iostream>
int main() {
constexpr int N = 5;
int arr[N]; // 크기 5의 배열 선언
for (int i = 0; i < N; i++) { // 0부터 4까지 반복
arr[i] = i * 10; // 각 요소에 값 대입 (0, 10, 20, 30, 40)
}
for (int i = 0; i < N; i++) { // 배열 출력
std::cout << arr[i] << '\n';
}
return 0;
}
출력 결과
0
10
20
30
40
i < 5 (크기 5일 때 0~4). i <= 5는 범위 초과 → 스택 오염.배열에서 가장 위험한 실수는 “한 칸 더 쓰기”입니다.
이건 단순한 실수가 아니라 정의되지 않은 동작(UB) 으로, 증상이 매번 달라질 수 있습니다.
int arr[5];
for (int i = 0; i <= 5; i++) { // ❌ 총 6회 반복 → arr[5]는 존재하지 않음
arr[i] = i * 10;
}
arr의 유효한 인덱스 범위는 0 ~ 4.i = 5일 때 arr[5] = 50; → 존재하지 않는 메모리 접근.Run-Time Check Failure #2 - Stack around the variable 'arr' was corrupted.i < 배열크기 형태로 지정.스택에서 이런 일이 생긴다고 생각하면 됩니다(개념 그림).
┌─────────────── 스택 프레임 ───────────────┐
│ arr[0] arr[1] arr[2] arr[3] arr[4] │ ← 배열의 유효 범위
│ [다른 지역 변수 / 저장된 값 / (디버그)보호값] │ ← arr[5]가 여기로 침범할 수 있음
└───────────────────────────────────────────┘
i <= 5가 아니라 i < 5여야 할까?int map[25] → index = y * MAP_SIZE + x 공식으로 좌표→인덱스 변환.int map[5][5] → map[y][x]로 직접 접근. 구조적으로 더 직관적.예를 들어 MAP_SIZE = 5일 때, ((x, y))를 1D 인덱스로 바꾸는 공식은 다음입니다.
[
\text{index} = y \times \text{MAP_SIZE} + x
]
직관 체크(5×5):
y=0: 0 1 2 3 4
y=1: 5 6 7 8 9
y=2: 10 11 12 13 14
y=3: 15 16 17 18 19
y=4: 20 21 22 23 24
x=0 1 2 3 4
즉, 2D 배열 map[y][x]도 내부적으로는 “행(row) 단위로 이어붙인 연속 메모리”라고 생각하면 됩니다. (행 우선, row-major)