[완료]atoi 와 strtol의 차이점

segenny의 이미지

안녕하십니까? 매번 질문만 올리네요.. 언제쯤 시원하게 답변을 달아 드릴수 있을까...

프로그램이 불특정부분에서 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 호출로 인해서 나오는
경우가 있나요?..

winner의 이미지

표준에도 strtol(nptr, 0, 10) 과 atoi(nptr) 은 동일하다고 나옵니다.

imyejin의 이미지

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

winner의 이미지

읽어보세요... ^_^

imyejin의 이미지

흠 그런데 왜 strtol 이랑 atoi 랑 둘다 있는 건가요?

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

winner의 이미지

(strtoul 을 딱 한번 썼습니다.)
strtol 류는 대단히 범용적으로 쓸 수 있는 interface 를 갖추고 있습니다.

몇몇 다른 programming 언어와 달리 인자기본값을 지정할 수 없는 C 에서
쓰기 편하라고 atoi 가 만들어진 거겠죠.

hongminhee의 이미지

표준 라이브러리의 구현에 따라 다르겠지만, 윗분 말씀처럼 atoi() 구현에 strtol()을 사용했을 수도 있습니다.

superkkt의 이미지

C 표준 함수에서 fault가 발생하고, 특히 발생하는 위치가 일정하지 않는 경우에는 거의 대부분 코드의 다른 부분에서 이미 memory corruption이 발생한 경우입니다. valgrind 같은 툴을 사용해서 메모리 침범이 발생하는 포인트를 찾아서 해결하는게 가장 빠른 방법입니다. 질문과는 좀 벗어난 답변입니다만 제가 자주 고생하는(?) 문제라서 답글 답니다.

======================
BLOG : http://superkkt.com

======================
BLOG : http://superkkt.com

엠브리오의 이미지

core dump 파일이 생성될때 마다 gdb에서 로딩한 다음 up 명령어로 어느 함수에서 호출되었는지를 살펴보시기 바랍니다. 불특정 부분에서 core dump가 일어난다고 해도 호출되는 부분에서 공통으로 쓰이고 있는 함수가 있을것 같습니다.

segenny의 이미지

계속 코어와~ 놀아야 겠습니다. 감사합니다.

안된다고 하지말고 아니라고 하지말고 어떻게~!

된다!고요~~

cinsk의 이미지

대부분 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/

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.