보통 초보자에게
2. char data[] = "hello world";
코드는 같다고 한다.
그런데 아래의 지시대로 한번 해보면 재미있는 현상이 일어난다.
1. strtok함수를 사용하여 공백 분할을 해보자
2. VC에서 디버거 모드로 실행 보고 릴리즈 모드로 실행 해보자.
디버거 모드일 경우 char*로 선언한 문자열에서 에러를 낸다.
왜 그럴까?
DarkAngel녀석과 한동안 신나는 토의를 했고 결국엔 귀착점에 도달할 수 있었다.
그건 디버그 모드에서는 []로 선언 했을 경우 .data 섹션 즉 읽기/쓰기가 가능한 섹션에 들어가지만 char*로 할 경우 코드 섹션에 들어가 버려서 strtok의 함수가 자르는 과성에서 생기는 delimiter를 기록하다가 읽기 전용 메모리에 막혀서 에러를 내는 경우였으니까 말이다. (메모리 주소를 보자!!!)
정확하게는 const char* const data = "hello world"; 선언이 되어야 한다.
결론은 컴파일러가 쓰지 말아야 할 곳에 데이타를 써버렸다는 것이다. 된장..
뭐 이건 VC에 한정된 것은 아니다. gcc도 이와 동일한 현상을 보인다.
재미 있다.
한번 해보는 것도 정신 건강에도 유익한 교육이 될 것 같다. ( ..)
Posted by 하얀 고양이


