:: 게시판
:: 이전 게시판
|
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
09/03/11 10:50
char *p = "ABCDE" 로 하지 마시고..
char p[6] = "ABCDE" 로 하세요. 물론 q도... 배열과 포인터의 차이는... 차차 알게 됩니다. ^^;;
09/03/11 10:54
초핀님// 답변 감사드립니다.
제가 모르는 내용이 많군요. 그럼 제가 정말 구현중인 코드를 올려보겠습니다. 그런데 이게 좀 길긴한데... 생각해보아야겠군요.
09/03/11 11:14
변수는 바뀔수 있고 상수는 바뀔수가 없습니다.
p와 q는 배열상태가 아니라 주소를 가지고 있을뿐입니다. p와 q가 가리키고 있는건 문자열 상수의 주소거든요. 차분하게 에러메시지 해석해보세요. 조작할수 없다 쓰기위반이다 이런 말입니다. 해결법은 안군님 말씀대로구요. 배열과 포인터의 차이는 c책에서 포인터 배열 메모리 관리 부분을 읽어보시면 되겠네요. 메모리에 관한 차이거든요
09/03/11 12:53
while(*p != '\0' || *q != '\0')
tem = *p; *p = *q; *q = tem; p++; q++; 루프하는곳만 썻는데. 워낙에 하질안아서.. 한번돌려보세요.. 그리고 두문자열의 길이가 다를때에는 좀더 추가해야할겁니다..
09/03/11 13:07
음...윗분들이 다 대답을 해주셨지만 나름대로 사족을 달자면요..^^;;
하드디스크에 있는 어떤 파일이 실행되기 위해서는 먼저 우리가 RAM 이라 부르는 메모리에 올라가야 합니다. 한마디로 컴을 사용하면서 실행되고 있는 모든 프로세스는 메모리 어딘가에 위치하고 있습니다. (O/S 간 스케쥴링에 따라 다르겠지만 프로세스 전체던 일부던 간에 어쨋든 올라가 있어야 합니다.) 또하나는 보호모드 입니다. 32비트 이상의 cpu 또는 o/s 에서 지원하는 이 기능은 제가 설명드리기 보다는 네이버에서 검색하시는 편이 나을 듯 합니다. (너무 길어져서요;;) 간단하게 얘기하면, 한 프로세스가 다른 프로세스의 영역을 건드리지 못하게 하는 거라고 할 수 있겠네요. 자 우선 이것을 베이스로 깔고.. 메모리에 올라간 프로세스는 [code] - 명령어 (실제 수행 코드) [data] - 변수 초기화 값 (위 코드에서 "ABCDE" 같은) [stack + heap] - 허가받은 사용 가능한 메모리 공간(우선 정도로 우선 이해하시면 좋겠네요.) 요래 3개 영역으로 구분할 수 있는데요, [code] 와 [data] 영역은 보호모드에서 동작?....보다는 보호된다고 해야하겠네요. 한마디로 [data] 영역은 프로세스 자신이 엑세스(접근)는 가능하지만 수정은 할 수 없습니다. char *p = "ABCDE"; 여기에서 ABCDE 는 [data] 영역에 존재하며 p 라는 변수는 ABCDE 가 저장된 주소를 가리키죠. 하지만 그 주소는 보호되는 영역이기 때문에 그곳의 값을 바꾸려 한다면(writing) access violation 이 발생합니다. Access violation writing location 0x004159b8 => 0x004159b8(ABCDE 가 저장된 메모리 주소) 에 쓰지마! 라는거죠....ㅡ_ㅡ; 안군님 말씀처럼 char p[6] = "ABCDE"; 가 에러가 나지 않는 이유는 배열로 선언된 변수의 경우 [stack] 영역에 변수의 공간이 생성되며 거기에 [data] 영역에 존재하는 "ABCDE" 를 복사해서 저장합니다. 즉, p라는 변수가 가리키고 있는 곳은 [data] 쪽이 아닌 [stack] 쪽이 되어 에러가 발생하지 않게 되는 거죠. 설명이 길어졌습니다만..도움이 되셨으면 좋겠네요. 포인터 같은 경우, computer architecture 를 같이 보시면 훨씬 많은 도움이 되실거에요.;;;
09/03/11 21:16
정신놓은너구리님이 잘 써주셨네요.
문자열을 소스와 같이 쓰신다면, 조심해야 합니당~ 수정이 안되기 땜에요~ 포인터를 공부하신다면, 스택, 힙, 데이타, 등의 메모리 공간 구조에 대한 공부를 먼저 하시는게 좋을 것 같습니다.
|