| [ 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가 바뀌는 경우도 생길 수 있죠. |