초기화 되지 않은 변수를 조건문에서 사용하면...

나는오리의 이미지

void foo()
{
       int bar;
       if(!bar) return;
}

위와 같이 bar가 초기화 되지 않은 int형 변수가
if문에서 조건으로 쓰여지면 !bar는 어떤 조건입니까?

void foo()
{
       int bar;
       bar = 0;
       if(!bar) return;
}

이것과 같은조건 아닌가요?

받은 소스에서 컴파일하는데 워닝나길래 찾아보니 초기화되지 않은 변수하나를
and조건에 걸어놨길래 ㅡ.ㅡ;;

참고로 VC++에서였습니다.
타 컴파일러도 동일조건일까요? ㅡ.,ㅡ?

bugiii의 이미지

지역 변수가 가지게 되는 값은 아무도 모릅니다. 쓰레기 값이라고도 합니다. 대부분 초기화 누락에 의한 숨겨진 버그가 발생할 가능성이 높습니다.

만약 그 변수가 전역이나 static 이라면 0으로 초기화될 가능성이 있지만 이것도 플래폼에따라 그렇지 못한 경우가 분명히 있습니다.

여하튼 변수는 가능한 한 꼭 초기화 시켜서 사용해야 합니다.

shamlock의 이미지

bar라는 변수를 찍어보시면 좋을듯..^^

0으로 초기화가 되는지...

함수에 변수 선언하면 그냥 쓰레기 값입니다.
이론적으로는 실행할때마다 값이 틀릴수 있으므로
쓰레기값을 신뢰하면 안되겠죠?

참고로 자바에서는 컴파일 오류납니다.
프로그래머가 실수 했을것이라고 컴파일러가 생각하는것이죠
C에서는 컴파일 오류 안나구요

@.@

나는오리의 이미지

bugiii wrote:
지역 변수가 가지게 되는 값은 아무도 모릅니다. 쓰레기 값이라고도 합니다. 대부분 초기화 누락에 의한 숨겨진 버그가 발생할 가능성이 높습니다.

만약 그 변수가 전역이나 static 이라면 0으로 초기화될 가능성이 있지만 이것도 플래폼에따라 그렇지 못한 경우가 분명히 있습니다.

여하튼 변수는 가능한 한 꼭 초기화 시켜서 사용해야 합니다.

헐...이거 어떻게하죠 ㅡ.,ㅡ;;;
그부분은 모회사제품의 라이브러리에 있는건데 ㅡ.ㅡ;;;
근데 그 모회사가 독일회사인데...;;;
미치겠군요. -_-;
seoleda의 이미지

VC++ 디버그 모드에서는 0으로 초기화 되는거 같던데요.

물론 명시적으로 "디버그 모드에서 지역변수는 초기화 되지 않았을때, 값이 0이다" 라는 내용은 본적이 없습니다. 하지만, 경험상 항상 0이 되는거 같더군요 ^^

나는오리의 이미지

seoleda wrote:
VC++ 디버그 모드에서는 0으로 초기화 되는거 같던데요.

물론 명시적으로 "디버그 모드에서 지역변수는 초기화 되지 않았을때, 값이 0이다" 라는 내용은 본적이 없습니다. 하지만, 경험상 항상 0이 되는거 같더군요 ^^

아...그런가요?
제 윗선에 보고하니...
오랜기간 사용해왔는데 이상없는 라이브러리이니 당분간은 그냥 쓰자로 결과가 나왔습니다. -_-;

답변해주신 두분께 감사드립니다.

doldori의 이미지

bar가 쓰레기값을 갖긴 하지만 실행 시간에 초기값이 0일 확률은 거의 없습니다.
그런데 프로그램 로직상으로도 bar가 0일 확률이 적다면 겉으로 보기에는 문제가
없는 것처럼 보일 수도 있겠죠. 언제 터질지 모르는 시한폭탄을 안고 있는 거나
마찬가지입니다.
소스를 갖고 계시나 본데 그걸 수정할 수는 없나요? 아니면 그 독일회사에 문의를
해보시든지요.

chadr의 이미지

VC 2003에서 저런 구문이 있으면 디버그 모드에서 지역변수 bar가 초기화 되지 않고 사용됬다면서 런타임 예외가 발생하더군요..

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

나는오리의 이미지

윗분들 말씀을 들으니...
음...아무래도 문의해보는쪽이 좋을것 같네요.
시간나는데로 문의할곳을 찾아봐야겠네요.
한국 지사나 뭐 그런곳이 있는지...;;;
독어는 배운적이 없어서 ㅠ.ㅠ
그렇다고 영어도 못하니...

pinetr2e의 이미지

bugiii wrote:

만약 그 변수가 전역이나 static 이라면 0으로 초기화될 가능성이 있지만 이것도 플래폼에따라 그렇지 못한 경우가 분명히 있습니다.

POD type에 대해서는 전역이나 static 변수는 규격적으로 zero-initialized, 즉 0으로 초기화 된다고 알고 있습니다.

그 플래폼에 따라 그렇지 못한 경우는 구체적으로 무엇을 말씀하시는지요 ?

bugiii의 이미지

pinetr2e wrote:
bugiii wrote:

만약 그 변수가 전역이나 static 이라면 0으로 초기화될 가능성이 있지만 이것도 플래폼에따라 그렇지 못한 경우가 분명히 있습니다.

POD type에 대해서는 전역이나 static 변수는 규격적으로 zero-initialized, 즉 0으로 초기화 된다고 알고 있습니다.

그 플래폼에 따라 그렇지 못한 경우는 구체적으로 무엇을 말씀하시는지요 ?

현실이 그렇지 못하다는 것입니다. 임베디드나 8비트 CPU 용 컴파일러를 쓰는 경우에 0으로 초기화되지 않아서 발생하는 문제가 있는 경우가 있습니다. 제 기억으로는 VxD 드라이버를 만들 때도 그런 경우가 있었던 걸로 기억하고 있습니다.

댓글 달기

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