C언어 문자열 입출력
글쓴이: tkeins / 작성시간: 목, 2009/07/23 - 11:07오후
C기초 플러스 5판으로 문자열 공부중인데 책에서 이해 안가는 부분이 있습니다.
char *p1 = "klingon";
p1[0] = 'F';
printf("klingon");
printf(": Beware the %ss!\n", "klingon");
이렇게 나와있는데 이상하게 컴파일하면 Segmentation fault가 나옵니다.
넷째줄에 "klingon"을 p1으로 바꿔보기도 했는데 같은 결과가 나오네요.
결과가
klingon: Beware the Flingon으로 나와야 되는게 아닌가요?
책에는
Flingon: Beware the Flingon으로 나와있는데 이해가 안가네요.
고수님들 설명좀 부탁합니다.
Forums:
책이 잘못되었네요.
char *p1 = "klingon";
이렇게 하였을 때 "klingon"은 string constant로 변경할 수 없는 것이 맞습니다.
이런 식으로 string constant를 대입할 때에는 변결할 수 없는 것을 확실하게 하기 위해
const char *p1 = "klingon"; 처럼 const를 붙여주는 것이 좋습니다.
원하는 바대로 변경하고자 하면
char p1[] = "klingon";
이렇게 배열로 정의하여야 합니다.
책에서도 그런 말이
책에서도 그런 말이 있었습니다.
그래서 const를 붙였더니 assignment of read-only location '*p1' 이라고 하네요.
그리고 const를 붙이면 두번째 줄에서 p1[0] = 'F'로 변경할수 없는게 아닌가요?
^^ 이제야 이해할거
^^ 이제야 이해할거 같네요. 감사합니다.
변수와 상수의 차이
char *a="hello"
char b[]="hello"
두개 차이가 있습니다
a는 상수로 잡히지만, b는 변수로 잡히죠
dump 떠보면 a는 read only data 영역에 있지만, b는 변수기 때문에 스택에 올라가 있습니다
a를 수정하려고 하면 상수이기 때문에 수정이 안되죠
Re:
변수와 상수의 차이 라고 이야기하면 더 헤깔릴 것 같네요.
문법적으로는 둘 다 변수(Variables) 니 말이죠..
변수/상수의 차이라고 이야기 해 버리면,
char *a = "..." 같은 정의는
자동적으로 const 한정자가 붙는 것인가 보다.. 라고 이해해 버릴 위험성(...) 이 있습니다.
댓글 달기