[완료]atoi 와 strtol의 차이점
글쓴이: segenny / 작성시간: 수, 2007/04/25 - 11:16오전
안녕하십니까? 매번 질문만 올리네요.. 언제쯤 시원하게 답변을 달아 드릴수 있을까...
프로그램이 불특정부분에서 Seg..fault가 일어나서 core dump 파일을 생성시켜 보니깐.
Program terminated with signal 11, Segmentation fault. Reading symbols from /lib/tls/libpthread.so.0...done. Loaded symbols for /lib/tls/libpthread.so.0 Reading symbols from /usr/lib/mysql/libmysqlclient_r.so.14...done. Loaded symbols for /usr/lib/mysql/libmysqlclient_r.so.14 Reading symbols from /usr/lib/libstdc++.so.6...done. Loaded symbols for /usr/lib/libstdc++.so.6 Reading symbols from /lib/tls/libm.so.6...done. Loaded symbols for /lib/tls/libm.so.6 Reading symbols from /lib/libgcc_s.so.1...done. Loaded symbols for /lib/libgcc_s.so.1 Reading symbols from /lib/tls/libc.so.6...done. Loaded symbols for /lib/tls/libc.so.6 Reading symbols from /lib/ld-linux.so.2...done. Loaded symbols for /lib/ld-linux.so.2 Reading symbols from /lib/libcrypt.so.1...done. Loaded symbols for /lib/libcrypt.so.1 Reading symbols from /lib/libnsl.so.1...done. Loaded symbols for /lib/libnsl.so.1 Reading symbols from /usr/lib/libz.so.1...done. Loaded symbols for /usr/lib/libz.so.1 Reading symbols from /lib/libssl.so.4...done. Loaded symbols for /lib/libssl.so.4 Reading symbols from /lib/libcrypto.so.4...done. Loaded symbols for /lib/libcrypto.so.4 Reading symbols from /usr/lib/libgssapi_krb5.so.2...done. Loaded symbols for /usr/lib/libgssapi_krb5.so.2 Reading symbols from /usr/lib/libkrb5.so.3...done. Loaded symbols for /usr/lib/libkrb5.so.3 Reading symbols from /lib/libcom_err.so.2...done. Loaded symbols for /lib/libcom_err.so.2 Reading symbols from /usr/lib/libk5crypto.so.3...done. Loaded symbols for /usr/lib/libk5crypto.so.3 Reading symbols from /lib/libresolv.so.2...done. Loaded symbols for /lib/libresolv.so.2 Reading symbols from /lib/libdl.so.2...done. Loaded symbols for /lib/libdl.so.2 Reading symbols from /lib/libnss_files.so.2...done. Loaded symbols for /lib/libnss_files.so.2 #0 0x00a56ccc in ____strtol_l_internal () from /lib/tls/libc.so.6 (gdb)
이런부분이 나오고 프로그램은 죽는데요, 소스 안에는 atoi함수를 쓰지만 strtol 함수를 쓰지는 않는데,
혹시 내부적으로 strtol 함수를 호출하는 걸까요?
아니면 프로그램 내부에 Mysql C API를 호출하는데 MySQL 함수 중에 strtol 호출로 인해서 나오는
경우가 있나요?..
Forums:
atoi 가 strtol 을 쓸 법하죠.
표준에도 strtol(nptr, 0, 10) 과 atoi(nptr) 은 동일하다고 나옵니다.
atoi 는 C 표준라이브러리 함수가 아닌데 표준에 나오나요?
[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
표준 맞답니다.
읽어보세요... ^_^
아 맨페이지 다시 보니 표준이라고 나오네요
흠 그런데 왜 strtol 이랑 atoi 랑 둘다 있는 건가요?
[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
저는 strtol 을 쓴 적이 없지만
(strtoul 을 딱 한번 썼습니다.)
strtol 류는 대단히 범용적으로 쓸 수 있는 interface 를 갖추고 있습니다.
몇몇 다른 programming 언어와 달리 인자기본값을 지정할 수 없는 C 에서
쓰기 편하라고 atoi 가 만들어진 거겠죠.
표준 라이브러리의
표준 라이브러리의 구현에 따라 다르겠지만, 윗분 말씀처럼 atoi() 구현에 strtol()을 사용했을 수도 있습니다.
C 표준 함수에서
C 표준 함수에서 fault가 발생하고, 특히 발생하는 위치가 일정하지 않는 경우에는 거의 대부분 코드의 다른 부분에서 이미 memory corruption이 발생한 경우입니다. valgrind 같은 툴을 사용해서 메모리 침범이 발생하는 포인트를 찾아서 해결하는게 가장 빠른 방법입니다. 질문과는 좀 벗어난 답변입니다만 제가 자주 고생하는(?) 문제라서 답글 답니다.
======================
BLOG : http://superkkt.com
======================
BLOG : http://superkkt.com
core dump 파일이
core dump 파일이 생성될때 마다 gdb에서 로딩한 다음 up 명령어로 어느 함수에서 호출되었는지를 살펴보시기 바랍니다. 불특정 부분에서 core dump가 일어난다고 해도 호출되는 부분에서 공통으로 쓰이고 있는 함수가 있을것 같습니다.
관심을 가져줘서 감사합니다.
계속 코어와~ 놀아야 겠습니다. 감사합니다.
안된다고 하지말고 아니라고 하지말고 어떻게~!
된다!고요~~
대부분 strtol(3),
대부분 strtol(3), strtoul(3)을 거의 쓰지 않는다고 하셨는데, atoi(3)를 쓰는 것은 별로 바람직하지 않습니다. 왜냐하면 에러가 발생했을 경우에 그 에러를 알 방법이 없기 때문입니다. strtol(3), strtoul(3)과 다르게 atoi(3)는 에러가 발생한 경우에 이 에러를 알려주지 않습니다.
대부분 표준 함수와 마찬가지로 errno를 설정할 것이라 생각하시는 분도 많겠지만, atoi()는 errno를 설정할 의무가 없다고 알려져 있기 때문에, 가능하면 strtol(3) 계열의 함수를 쓰는 것이 더 바람직합니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기