[완료] 64bit RHEL 5에서 C 프로그램이 이상하게 작동하는 문제
최근에 쿼드코어 서버가 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)
대답해주시는 분께 미리 감사드립니다.
long 대신 int 를 사용하세요.
64bit linux 에서 long type은 64bit 의 크기를 갖습니다.
반면 int는 32bit linux와 같이 32bit 의 크기를 갖게됩니다.
위의 프로그램을 보시면, i, i1의 type을 long으로 해서 64bit로 잡으신 후, 실제 사용하실 때엔 %ld 가 아닌 %d 를 사용하셔서 모두 32bit 형식으로 사용하셨습니다.
이에 크기에 의해 여러 잘못된 결과가 나올 수 있는 것입니다.
선언하실 때 int로 선언하시고 사용하시거나, scanf/printf에서 %d 대신 %ld 을 사용하시면 될 것입니다.
자진삭제
,
아.. 그렇군요.
그런 문제가 있었네요.
흠.. 제 경운 32/64bit를 왔다갔다 사용해야하고, 인덱스가 좀 큰 경우까지 올라가야하니까(애초에 그래서 long을 썼던 거죠.), 그렇다면 int로 선언하기보단 %ld를 사용해야겠군요.
알려주신 분들 고맙습니다.
댓글 달기