|
광양님 안녕하셨죠?
조만간 광양님 볼 날도 멀지 않았군여^^
제가 책에서 본 바로는요...
1. char name[7] = {'T', 'i', 'g', 'e', 'r', 's', '\0'};
2. char name[7] = {"Tigers"};
3. char name[7] = "Tigers";
4. char name[] = {'T', 'i', 'g', 'e', 'r', 's', '\0'};
5. char name[] = {"Tigers"};
6. char name[] = "Tigers";
7. char *name = "Tigers";
일단 7가지 모두 같은 표현입니다.
7번 표현이 문제인데요...
메모리상으로는 1~6은 7바이트를 차지하구요
7번은 9바이트를 차지합니다.
2바이트는 포인터 변수때문입니다.
윈도우는 4바이트라고 들었는데 도스는 2바이트 입니다.
그리고 7번 표현을 써서 문자 변경이 되고 안되는것은
컴파일러 마다 다르다고 합니다.
ANSI는 이 문제에 대해서 정의를 해놓지 않았다고 합니다.
책내용을 약간 수정하면
"1~6번은 배열이고 각각의 문자를 바꿀 수도 있지만 항상 일정한 장소에 저장되고
7번은 포인터라서 가리키는 '위치'를 바꿀 수 있지만 '내용'을 바꾸는 것은
정의되어 있지 않다(바꿀 수 없다는 말은 아니다)"
라고 되어있습니다.
책엔 ANSI가 정의를 하지 않은 이유는 없지만
개인적인 생각으론 정의를 하지 않은것과 빼먹은건 다르다고 생각합니다.
정의를 하지 않은 이유가 있겠죠 알게 되시면 갈쳐주시구여...
그리고 참고로...
char name[6] = "Tigers";
이라고 하면 마지막에 널문자가 빠진 '문자배열'이 됩니다.
책마다 혼용해서 쓰긴하지만 문자열과 문자배열을 구분(널문자의 유무)해서 쓰는게
좋을꺼 같습니다.
마지막으로 백일님이 말씀하신 내용과는 조금은 상반된 내용인거 같은데요
저의 개인적인 의견이 아님을 말씀드립니다.
문자열의 메모리 할당에 관해 어느 책에서 본적이 있는데 생각이 안나서요.
찾으면 다시한번 글 올리겠습니다.
|