그러니까 이렇게요
int a[] = {1,2,3,4}
이렇게 하는 건 되지만
char a[] = {'a','b','c','d','\0'}
char 배열에선 왜 널문자를 붙여야 되는지요?
char a[] = { 'a', 'b', 'c', 'd' };
하는 것도 가능합니다. 문제는 이렇게 배열을 구성할 경우, (null
character 를 통해 끝을 알 수 있는) string 이 아닌 (다른 방법을 통해
끝을 기억해야 하는) array of characters 로만 쓰일 수 있다는 것입니다.
C 에서 string 과 array of characters 는 엄연히 다른 개념입니다.
(IT 백두대간 C 언어, p.403, pp.468-470)
--
Jun, Woong (mycoboco at hanmail.net)
Information and Communications Univ.
"Jun Woong" <myco...@hanmail.net> wrote in message
news:br6ak5$fpj$1...@news.hananet.net...
char a[] = "abcd"; 와 char a[] = {'a','b','c','d'}; 는 다른 건가요?
"Jun Woong" <myco...@hanmail.net> wrote in message
news:br6ak5$fpj$1...@news.hananet.net...
>
어떠한 배열에도 (적절히 초기화 된다면) 쓰레기값이 붙지 않습니다. 님께
서는 "쓰레기값" 으로
char a[] = { 'a', 'b', 'c' , 'd' );
printf("%s\n", a); /* wrong */
와 같이 출력했을 때 보이는 abcd 이후의 (알 수 없는) 값을 의미하고 계시
지만, 이는 순수한 array of char 를 string 이 요구되는 문맥 (printf()
의 "%s") 에 전달했기 때문에 발생하는 문제이지 배열에 쓰레기값이 붙어있
기 때문이 아닙니다.
string 은 array of char 이지만 그 끝을 0 값의 null character 로 알 수
있도록 하자는 추가적인 약속을 갖는 개념일 뿐입니다. 예를 들어, 어떤
프로그램에서 int 형 배열의 끝을 -1 로 하자고 약속한다면,
int a[] = { 1, 2, 3, 4, -1 };
int *p = a;
while (*p != -1)
printf("%d\n", *p++);
와 같이 작성할 수도 있습니다. 만약, 이 프로그램에
int a[] = { 1, 2, 3, 4 };
를 사용한다면, 당연히 (끝에 -1 을 둔다는 약속을 어겼으므로) 그 끝을 알
수 없으니 님이 말씀하시는 "쓰레기값" 이 붙는 것처럼 보일 것입니다.
printf() 의 "%s" 처럼 (그 끝을 null character 를 통해 인식할 수 있는)
string 을 요구하는 문맥에 string 의 조건을 만족하지 않는 array of char
를 전달했을 때의 행동 역시 위의 예와 동일한 것 뿐입니다.
char a[] = "abcd";
는
char a[] = { 'a', 'b', 'c', 'd', '\0' };
를 편하게 쓰는 방법일 뿐입니다.
추측과 실습을 통해서 언어를 공부하는 것 보다는, 제대로 된 이론과 실습
을 통해 언어를 공부하시는 것이 더 나을 것 같습니다.