#include <stdio.h>
int main(){
char i[]="1234";
*i = 'a';
printf("%s\n", i);
return 0;
}
결과 : a234
#include <stdio.h>
int main(){
char *i="1234";
*i = 'a';
printf("%s\n", i);
return 0;
}
결과 : 런타임 에러
위와같이 문자열을 포인터변수로 담은것을 역참조하여 수정하려고 하면 실행중 뻗어버리는데,
배열에 담은 건 잘 바뀝니다.
두가지의 차이가 무엇인가요??
-----------------------------------------------------------------------------------------
char i[]="1234"; 는 메인 메모리 내에 i를 위한 공간이 잡히고 이 공간에 1234문자열이 들어 갑니다.
char *i="1234"; 는 읽기 속성으로 보호된 메모리에 문자열 1234가 존재하고 그 주소를 i가 가지고 있습니다.
쓰면 안되는 곳에 'a'값을 넣을려고 하니까 런타임 에러가 나는 것입니다.
Some examples:
char hello[] = "Hello world!";
char *bye = "Goodbye, cruel world!";
In the above, "Goodbye, cruel world!" is a string constant, and is stored in the text segment in the program's object code. That means you can't change it; you'll get a segmentation fault. The actual variable bye on the other hand, is a pointer, and gets 4 bytes (on most machines, anyway) in the data segment, and is initialised to point to the string in the text segment. So you can still change the value of bye, but not the string that it initially points to.
With hello, the string is stored in the data segment, where you can modify it to your heart's content
Finally, about strcpy and the meaning of const in its prototype:
음 저도 조금 전에야 제대로 알았네요.
막연히 알고는 있었지만,,,,
밑의 char *bye = "Goodbye, cruel world!"; 의 문자열은 실행파일에 데이터의 일부로써
존재하고 있습니다. 그래서 실행파일을 실행 중에 수정하는 것이 금지 되어 있기 때문에
심각한 문제가 벌어지는 것입니다.
명색이 디스어셈블러 저자인 본인이 이것을 까먹고 있었다니 부끄러운 일이군요!
항상 디스어셈블된 코드를 보면서 알고 있었던 사실인데,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
'c·c++ > c 프로그래밍' 카테고리의 다른 글
게임에서 사용할 키보드 입력 체크 (0) | 2012.01.18 |
---|---|
비쥬얼 씨++ 64비트 정수사용법 (0) | 2012.01.18 |
200!+300!+400! (0) | 2012.01.15 |
wxWidgets이 뭔가요? (0) | 2012.01.14 |
폰트로 사각형 그리기 (0) | 2012.01.14 |