너무 황당한 질문입니다만...

astronux의 이미지

안녕하세요.

C프로그래밍을 하다가 너무 황당한 일을 당해서요.
혹시 프로그램 내에서 변수의 위치에 따라 결과가 다르게 나올 수 있나요?
예를 들면, 제가 int xxx=0; 라는 변수를 10번째 줄에 적고(물론 main내에
있다고 가정), 컴파일 한 뒤 결과를 출력했을 때랑, 15번째 줄에 적고
컴파일&출력 했을때랑 결과가 다르게 나올수 있나요?

제가 겪은 일은 다음과 같습니다.
어떤 한 프로그램을 짰고(이름:A), A가 잘 돌아가는 것을 확인하고,
이것을 응용해서 다른 B라는 프로그램을 짰는데, 이 B가 그런 문제를
일으키더군요.
A는 잘 돌아가는데, B는 계속 세그폴트가 나더군요.
A를 응용해서 B를 만들었다고는 했는데, 사실 응용이라기 보다는
거의 베낀거고, 다만, 받아들이는 arguments만 다를 뿐입니다.
그러니까 하나의 서브루틴을 이용해서 A를 만들었기 때문에
그다지 복잡한 내용이 들어갈것도 없었구요.
아무리 찾아봐도 에러가 날 부분이 없어서, 혹시나 싶어 변수명이 겹쳐서
그러나싶어 변수명도 제 아이디를 넣어서 해봐도 소용이 없더라구요.
그래서 변수를 정리해놓고 볼려고 변수들을 선언부에서 라인을 좀
옮겼더니, B도 아무 문제 없이 잘 돌아가더군요.

이런 일이 자주 있는건가요?
아니면 제 컴퓨터가 이상한 건가요?

어제 저녁부터 지금까지 이 문제로 머리가 터질것 같았는데, 어떻게 해결하긴
했지만, 너무 황당한 곳에서 문제가 발생하는 바람에 시원하지가 않습니다.

답변 부탁드립니다.

segfault의 이미지

astronux wrote:
예를 들면, 제가 int xxx=0; 라는 변수를 10번째 줄에 적고(물론 main내에
있다고 가정), 컴파일 한 뒤 결과를 출력했을 때랑, 15번째 줄에 적고
컴파일&출력 했을때랑 결과가 다르게 나올수 있나요?

같은 프로그램도 잘못 짰을때는 매번 실행할때마다 다른 결과가 나올 수 있습니다.

실제로 저런 사항은 컴파일시 전혀 실행 코드에 영향을 미치지 않습니다.

아마도 우연일 듯 합니다.

astronux의 이미지

제가 예를 들면서 단순히 정수로만 예을 들었는데, 변수로 포이터를 많이 사용했었거든요.
저도 잘 모르지만, 실제로 똑같은 코드인데, 변수 선언라인 몇 줄을 옮겼을때와 옮기지 않았을 때 컴파일에는 영향을 미치지 않았지만, 결과에서는 영향을 미치더군요.
저도 혹시나 하고 다른 사람보고 해보라고 했는데, 역시나 저와 같은 상황이 나오더군요.

쩝~ 머가 잘못되었던 것일까요?

Astronomy+Linux

Prentice의 이미지

소스를 보여주시죠.. ^_^;

befoed의 이미지

그냥 추측일 뿐입니다.
가끔 그런 경우를 당해봐서요..

소스코드를 올려 주시면 이해하기 좀더 쉬울듯 합니다.

싸인문구;;남들은 멋있게 쓰던데..난 멀해야 할까..

eminency의 이미지

예전에 친구가 자기 소스의 버그를 잡아달라길래 소스를 봤는데 두 시간은 족히 걸린 것 같습니다.

나중에 알고 봤더니 int a[2]로 선언해놓고 a[2]에다 값을 집어넣고 있더군요. 이런 경우는 컴파일 할 때 에러가 나지 않지요. C에서는 언어 특성상(?) array의 boundary를 체크하지 않기 때문입니다. a[2]는 a+2랑 같으니까요...

어쨌거나 그런 류의 에러같습니다. 어딘가 잘못된 부분이 분명히! 있을 것입니다. -_-;;;

컴퓨터는 거짓말을 하지 않지요...
아, 거짓말 하는 경우도 있긴 합니다. 사람이 시키면...ㅡㅡ;;

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

댓글 달기

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