CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): parresia (누구게)
날 짜 (Date): 2003년 1월  3일 금요일 오전 08시 56분 35초
제 목(Title): Re: [질문] 포인터와 배열 차이 .....



C에서 문자열 상수의 내용을 바꾸는 것은 정의되지 않은 결과를 낳게 됩니다.

char *temp = "this is test."; 와 char temp[] = "this is test."; 는 엄연히
다른것입니다. 하나는 문자열상수 "this is test."의 첫 번지를 포인터 temp가
가리키게 되는 것이고, 두번쨰는 "this is test."가 들어갈 수 있는 정도의
공간이 배열 temp에 잡히고, 그 배열의 내용이 this is test."로 초기화 되는
것입니다.

실제로는 일반적으로는 앞의 문자열 상수 선언은 문자열이 read-only data
area에 잡히게 되고, 뒤의 배열은 read-write가 가능한 위치에 잡히게 되는 
경우가 일반적인 구현입니다만, 컴파일러나 시스템에 따라서는 read-only
area를 잡지 않거나 만들 수 없어서, 문자열 상수 내부의 값을 변경해도
아무 에러가 안날 수도 있습니다. 

또 한가지, 문제가 생기지 않는 경우라도 정의되지 않는 행동을 하는 
코드를 작성하는 것은 바람직하지 않습니다. 컴파일러에 따라서는 문자열 
상수를 공유하는등 최적화를 실시할 수 있는데, 이 경우 
정말 잡기 어려운 버그가 생길 수 도 있습니다. 예를 들어 

char *temp = "this is string.";
char *temp2 = "this is string.";
char *temp3 = "string.";

이렇게 했을 경우, 어떤 경우엔, temp와 temp2는 같은 주소를 가리키고,
temp3가  temp+8을 가리킬 수도 있습니다. 만약 temp가 가리키는 문자열의
일부를 바꾼다면, temp2나 temp3가 바뀌는 경우도 생길 수 있죠. 


[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.