배열은 같은 타입의 객체를 연속된 메모리에 둔다. C 배열은 함수로 넘기는 순간 포인터로 줄고 길이를 잃는다. 길이가 타입에 남는 `std::array`와 길이가 변하는 `std::vector`가 보통의 선택이다.

C++ 7. 배열과 문자열의 핵심 흐름도
그림. 길이와 소유권이 드러나는 표준 타입을 우선한다.

연속 저장

#include <array>
#include <string>
#include <vector>

std::array<int, 9> files{};
std::vector<int> plies;
plies.push_back(1);
plies.push_back(2);

std::string name = "초";
name += "나라";

`vector`는 끝이 꽉 차면 더 큰 버퍼를 잡고 원소를 옮긴다. 그 순간 기존 원소를 가리키던 포인터와 참조는 무효가 된다. 개수를 알면 `reserve`로 재할당을 줄인다.

문자열의 끝

C 문자열은 마지막에 `\0`이 있다. 이 널 문자를 데이터로 착각하거나, 버퍼보다 긴 입력을 쓰면 인접 메모리를 덮는다. 입력은 `std::string`과 `std::getline`으로 받고, `gets` 같은 경계 없는 함수는 쓰지 않는다.

문자 하나의 인코딩과 `char`의 부호는 구현마다 다를 수 있다. 바이트를 다룰 때는 `std::byte`나 `unsigned char`를 고려한다.