티스토리 뷰
char* GetStr() { static char szStr[] = "Hello"; return szStr; } void PrintStr(char **str) { printf("%s",*str); } int main(int argc, char **arv) { PrintStr(&GetStr()); return 0; }
위 코드는 아래와 같은 컴파일 에러를 발생시킨다.
error C2102: '&' requires l-value
컴파일러의 에러는, l-value. 즉, 어딘가에 저장된 값에만 주소 연산자를 사용할 수 있다는 말이다.
내가 이 코드를 작성한 의도는 char형 포인터의 포인터 (이중 포인터)를 매개 변수로 받는 PrintStr함수의 매개변수로, char형 포인터를 반환하는 GetStr함수의 반환 값의 주소를 넘기면 정상적으로 동작할 거라는 생각에서였다.
그래서 내가 생각한 해답은, GetStr함수가 반환할 char형 포인터 주소인
GetStr() 0x00427b60 "Hello" char *가 아니라, GetStr의 반환 값이 임시 저장되어 있는, 레지스터의 주소를 대입하려 하는 건 아닐까 생각했다.
int main(int argc, char **arv) { char *str = GetStr(); PrintStr(&str); return 0; }이 코드를 디스 어셈블 해본 결과다.
char *str = GetStr(); 00412BDE call GetStr (411500h) 00412BE3 mov dword ptr [str],eax역시 추측이 맞았다. GetStr함수를 부른 결과는 eax 레지스터에 저장되어 있었고, 그 값을 어딘가에 복사하기 전까진, 레지스터에 있는 값이므로, 레지스터에 주소 연산자를 사용할 수 없기 때문에 컴파일 에러를 낸 것이었다.
'C++ > General' 카테고리의 다른 글
Smart Pointers (Modern C++) (0) | 2013.02.06 |
---|---|
윈도우 예외 처리에 대한 정리 (0) | 2011.08.24 |
any_ptr - A Type-safe Generic Pointer (0) | 2010.09.30 |
C++ 예외, 크래시, Hang 처리 (0) | 2010.07.15 |
WIN32 Console Application 에서 MFC 사용하기 (2) | 2010.01.22 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 멀티스레드
- 리버스 엔지니어링
- CppSQLite
- 조엘 온 소프트웨어
- 엘키
- EzShortcut
- perfmon
- MS-SQL
- 바로가기 프로그램
- TDD
- SQLite Spy
- 디자인 패턴
- 게임데브포에버
- 루비
- EasyExec
- 디버깅
- Rails
- 루비 온 레일즈
- RoR
- SDL
- c언어
- ftp
- TraceRoute
- 게임개발포에버
- svn
- 임백준
- NDC2013
- 좋은 프로그래머
- ruby
- Ruby on Rails
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함