[완료] 64bit RHEL 5에서 C 프로그램이 이상하게 작동하는 문제

johnnyp의 이미지

최근에 쿼드코어 서버가 Redhat Enterprise Linux 5.2랑 같이 도입됐는데, 여기서 그동안 탈 없이 돌아가던 C 소스를 컴파일해서 돌렸더니 무한루프로 빠져버리는 문제가 생겼습니다.

이것저것 테스트해봤더니, 64비트 버전의 RHEL 및 Fedora 9에서 이런 문제가 생기는 걸 확인했는데... (다른 리눅스는 모르겠습니다. 제 주위엔 온통 레드햇 계열이라), 혹 제가 작성한 프로그램에 어떤 문제가 있었는지, 아니면 이게 버그인지 궁금하군요. 참고로 아래와 같은 소스를 컴파일해서 실행하면 프로그램이 정해진 루프만 돌고 빠져나오지 못하고 무한루프로 돌아버립니다.

#include <stdio.h>
 
int main(void)
{
   long i, i1;
 
   scanf("%d", &i1);
   for (i = 0;i < i1;i++) printf("%d %d\n", i, i1);
 
}

위의 코드를 gcc로 컴파일하고 실행시키면, 일단 입력까진 잘 받습니다. 전 시험삼아 15란 숫자를 넣었는데, 루프로 들어가면 i와 i1의 숫자를 제대로 표시합니다. 한데 i가 14가 될때까지만 실행되다 빠져나와야하는데, 전혀 그렇지 못합니다.

참고로 제가 사용한 gcc는 아래와 같습니다. (gcc -v 정보 표시)
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux
Thread model: posix
gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)

대답해주시는 분께 미리 감사드립니다.

molla의 이미지

64bit linux 에서 long type은 64bit 의 크기를 갖습니다.

반면 int는 32bit linux와 같이 32bit 의 크기를 갖게됩니다.

위의 프로그램을 보시면, i, i1의 type을 long으로 해서 64bit로 잡으신 후, 실제 사용하실 때엔 %ld 가 아닌 %d 를 사용하셔서 모두 32bit 형식으로 사용하셨습니다.

이에 크기에 의해 여러 잘못된 결과가 나올 수 있는 것입니다.

선언하실 때 int로 선언하시고 사용하시거나, scanf/printf에서 %d 대신 %ld 을 사용하시면 될 것입니다.

자진삭제의 이미지

,

johnnyp의 이미지

그런 문제가 있었네요.

흠.. 제 경운 32/64bit를 왔다갔다 사용해야하고, 인덱스가 좀 큰 경우까지 올라가야하니까(애초에 그래서 long을 썼던 거죠.), 그렇다면 int로 선언하기보단 %ld를 사용해야겠군요.

알려주신 분들 고맙습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.