인프런 커뮤니티 질문&답변
char cookies[1] = {'A',} 가 이해가 안되서 질문드립니다.
작성
·
30
1
안녕하세요.
char cookies[1] = {'A',};위 코드에서 이해가 안되는 점입니다.
문자 배열은 NULL 문자까지 포함해서 크기가 2여야 하는게 아닌지요?
위 배열 처럼 크기가 1인 경우 &cookies 주소의 바로 다음 주소가 NULL이되는 건지? (NULL은 어디에?)
이를 확인해 보기 위해
printf("%c\n", *(&cookies[0]+1));을 해보았으나?가 출력되더라고요
다른 질문을 보니
,(콤마)의 경우 자동으로 NULL문자를 만들어 주기 위함으로 붙이는데 크기가 1인 배열에도 붙여 줘야 하는건지 궁금합니다.
답변 2
1
안녕하세요? 질문&답변 도우미 durams입니다.
문자 배열은 NULL 문자까지 포함해서 크기가 2여야 하는게 아닌지요?
전통적인 C 스타일 문자열은
char타입 배열로, 맨 마지막 원소가 널 문자(\0)인 것이 맞습니다. 다만 강의에서 해당 배열이 나올 때는 배열의 길이로 지정 가능한 값에 대해 다루고 있으며, 문자열에 한정되는 이야기는 아닙니다. (단순히char타입의 배열 그 자체로 사용한다면 끝에 널 문자가 없어도 상관이 없는 것이죠)
위 배열 처럼 크기가 1인 경우 &cookies 주소의 바로 다음 주소가 NULL이되는 건지? (NULL은 어디에?)
널 문자(Null character)는 일반적으로
char타입이면서 값이 0인 것을 의미합니다. 주소가 NULL인 것과는 별개의 문제입니다.cookies배열의 크기가 1이기 때문에,printf("%c\n", *(&cookies[0]+1));는 정상 범위를 벗어나게 됩니다. 이 코드의 경우 포인터를 직접 연산했기 때문에 에러는 발생하지 않았지만, 사실상 out-of-bounds 문제를 발생시키는 위험한 코드입니다.
다른 질문을 보니
,(콤마)의 경우 자동으로 NULL문자를 만들어 주기 위함으로 붙이는데 크기가 1인 배열에도 붙여 줘야 하는건지 궁금합니다.사실 엄밀하게 말씀드리자면, '중괄호에 배열의 크기보다 작은 개수의 초기값이 전달된 경우, 나머지 원소들은 모두 해당 타입의 기본값으로 초기화된다.' 가 맞습니다.
int의 경우0이 되겠죠.콤마에는 널 문자를 만들어주는 기능이 없으며, 유무에 따라 동작 상 차이가 없습니다. 마지막에 저런 식으로 붙는 쉼표를 Trailing Commas라고 하는데요, 나중에 새로운 원소를 같이 초기화하도록 코드를 수정한다거나 할 때 유지보수 측면에서 편의성을 제공하는 기능입니다.
0
안녕하세요, 인프런 AI 인턴입니다. Lucas님, 질문 주셔서 감사합니다.
char cookies[1] = {'A',};에서 발생하는 여러 혼란스러운 점들을 설명해드리겠습니다.
배열 크기와 NULL 문자:
- 일반적으로 문자열을 저장할 때는 끝에 NULL 문자(
'\0')를 추가하여 문자열의 끝을 표시합니다. 그러나char cookies[1] = {'A',};는 단순히 크기 1의 문자 배열을 생성합니다. 여기서는 문자열이 아닌 단일 문자'A'를 저장하기 때문에 NULL 문자가 추가로 필요하지 않습니다.
- 일반적으로 문자열을 저장할 때는 끝에 NULL 문자(
다음 주소의 값:
printf("%c\n", *(&cookies[0]+1));는 배열을 넘어서 다음 메모리 주소의 값을 참조하려고 하기 때문에, 이는 정의되지 않은 동작을 일으킬 수 있습니다. 프로그램에 따라 메모리의 그 위치에는 어떤 값이든 있을 수 있으며, 언제나 확실한 NULL거나 의도한 값이 아닐 수 있습니다.
콤마 사용:
- 콤마는 배열 초기화 과정에서 추가로 값을 넣지 않을 때 사용될 수 있으나, 자동으로 NULL 문자를 작성하는 기능은 없습니다. 크기가 1인 배열의 경우 이 콤마는 없어도 무방하며, 이는 보통 리스트 마지막에 요소 추가를 의도적으로 안 했음을 분명히 하기 위한 스타일일 뿐입니다.
- 콤마는 배열 초기화 과정에서 추가로 값을 넣지 않을 때 사용될 수 있으나, 자동으로 NULL 문자를 작성하는 기능은 없습니다. 크기가 1인 배열의 경우 이 콤마는 없어도 무방하며, 이는 보통 리스트 마지막에 요소 추가를 의도적으로 안 했음을 분명히 하기 위한 스타일일 뿐입니다.
참조를 위해 유사한 질문 내용을 찾아보았습니다:
이해하시는데 도움이 되셨기를 바랍니다. 혹시 추가적인 질문이 있으면 언제든지 해 주세요. 저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






아 첫 번째 질문의 답변으로 두 번째 질문까지 이해가 되었습니다. 세 번째 질문의 쉼표 역할은 아직 와닿지 않지만 직접 경험하게 되면 알게 될 것 같습니다.
항상 친절한 답변 감사합니다!