강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

Lucas님의 프로필 이미지
Lucas

작성한 질문수

홍정모의 따라하며 배우는 C언어

11.1 문자열을 정의하는 방법들

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라고 하는데요, 나중에 새로운 원소를 같이 초기화하도록 코드를 수정한다거나 할 때 유지보수 측면에서 편의성을 제공하는 기능입니다.

       

Lucas님의 프로필 이미지
Lucas
질문자

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

항상 친절한 답변 감사합니다!

 

끝에 붙는 콤마의 경우 enum(열거형)에서도 자주 사용되니, 14.18 열거형에서 다시 떠올려보셔도 좋을 듯 합니다. 감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. Lucas님, 질문 주셔서 감사합니다.

char cookies[1] = {'A',};에서 발생하는 여러 혼란스러운 점들을 설명해드리겠습니다.

  1. 배열 크기와 NULL 문자:

    • 일반적으로 문자열을 저장할 때는 끝에 NULL 문자('\0')를 추가하여 문자열의 끝을 표시합니다. 그러나 char cookies[1] = {'A',};는 단순히 크기 1의 문자 배열을 생성합니다. 여기서는 문자열이 아닌 단일 문자 'A'를 저장하기 때문에 NULL 문자가 추가로 필요하지 않습니다.
  2. 다음 주소의 값:

    • printf("%c\n", *(&cookies[0]+1));는 배열을 넘어서 다음 메모리 주소의 값을 참조하려고 하기 때문에, 이는 정의되지 않은 동작을 일으킬 수 있습니다. 프로그램에 따라 메모리의 그 위치에는 어떤 값이든 있을 수 있으며, 언제나 확실한 NULL거나 의도한 값이 아닐 수 있습니다.
  3. 콤마 사용:

    • 콤마는 배열 초기화 과정에서 추가로 값을 넣지 않을 때 사용될 수 있으나, 자동으로 NULL 문자를 작성하는 기능은 없습니다. 크기가 1인 배열의 경우 이 콤마는 없어도 무방하며, 이는 보통 리스트 마지막에 요소 추가를 의도적으로 안 했음을 분명히 하기 위한 스타일일 뿐입니다.

참조를 위해 유사한 질문 내용을 찾아보았습니다:

이해하시는데 도움이 되셨기를 바랍니다. 혹시 추가적인 질문이 있으면 언제든지 해 주세요. 저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Lucas님의 프로필 이미지
Lucas

작성한 질문수

질문하기