초기화 안된 전역변수의 내재적인 오류에 대해..

gloomyr의 이미지

이전에 초기화 되지 않는 전역변수들은 0으로 초기화 되는것이 보장된다는 것에 대해 질문드렸엇는데
해답을 찾은거 같아서요

코드를 살펴보니
헤더파일에 이런식으로 정의 되어 잇더군요.
ex)
int a;
.
.
int a;
.
.
int a;
.
.
int a;
이런식으로 초기화 되지 않는 전역변수들이 중복 정의 되어 있는것입니다.

여기서 생각해볼수 있는게 초기화 안된 벼수들은 bss 영역으로 들어갈때 중복정의 되어있으면
예를들어 1->a, 2->a, 3->a, 4->a 이런식으로 들어가지 않나 싶은데요

그래서 컴파일러 전역변수 a에 대해 1->a의 영역을 0으로 초기화 시켷고
소스에서 a를 사용할때는 4->a가 호출되기 때문에 초기화 되지 않는 쓰레기값이 들어가 있지 않앗던가 싶은데요

명확하게 결론 내려주실분 잇으신가요~

jick의 이미지

다른 시스템은 잘 모르지만 linux 기준으로 말씀드리면, 초기화하지 않은 변수는 중복 정의할 수 있습니다.

이 경우 모두 하나의 변수로 매핑됩니다. 즉 위의 경우 단 하나의 파일에서 int a;라고 정의하고 나머지에서는 extern int a;라고 쓴 것과 동일한 효과가 됩니다.

(따라서 시작할 때에는 모두 0으로 초기화됩니다.)

물론 일반적으로 추천하는 방법은 아닙니다.

gloomyr의 이미지

정의 되는것은 알고 있엇지만요

실질적으로 소스를 사용하는곳에보니
0으로 초기화 되지 않는 가비지 값이 들어가 있는 현상이 발생해서 말입니다...

그래서 저렇게 유추해본건데..

리눅스 엔터프라이트 서버 5
2.6.18 버전 gcc 4.1.2 버전 입니다.

pastime의 이미지

기본적으로 gcc에서 중복 정의된 (초기화되지 않은) 변수들은 common block에 위치하게 됩니다.
위의 jick님이 답변처럼 이들은 하나의 변수로 처리되니
어떤 것은 0 값을 가지고 다른 것은 그렇지 않은 경우는 없을 것으로 보입니다.

의심스럽다면 컴파일 옵션에 -fno-common 플래그를 주어
중복 정의된 변수에 대해 에러를 발생시키도록 하고 명시적으로 이를 없앤 후
다시 테스트해 보시는 것도 좋을 듯 합니다.
(이는 또한 성능에도 약간의 이득이 있을 수 있습니다.)

그것도 아니라면 전역 변수와 동일한 이름을 가진 지역 변수가
어딘가에 존재하는 것은 아닌가 의심해 볼 수도 있겠군요..

ktd2004의 이미지

이건 전혀 다른 이야기 인데요..

예전 경험으로 전역 변수인 배열 a의 인덱스를 넘어서 쓸때,
다른 전역변수의 값이 뒤바뀌어 버립니다.

/* 전역 변수 */
char a[20];
int b;

찾는데 한참 걸렸죠.. ^^;

댓글 달기

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