[C언어 입문] 쓰레기값에 대한 질문..

개성만점의 이미지

안녕하세요? c언어와 싸우는 비전공자 입문자입니다. ^^

변수를 선언만 하고 초기화 하지 않으면 쓰레기값이 된다고 c언어 책에서 그랬습니다.
실제 예제를 보니 진짜 초기화하지 않은 값은 쓰레기가 들어있었습니다.

그런데,
제가 예제를 좀 바꾸어봤거든요? 크게 바꾼건 없고 순서를 좀 바꾸어봤는데..
버그가 생겼다그러고 비주얼스튜디오가 자꾸 멈칫멈칫 해서 자꾸 끄고키고 반복했습니다.
그리고 빌드 성공이라 뜨는데 콘솔창은 텅 비어있네요..

#include <stdio.h>
 
int main(void)
{
	int	num3, num4;
	int num1 = 10, num2 = 20;
 
 
 
 
	printf("num1:%d, num2:%d, num3:%d, num4:%d", num1, num2, num3, num4);
	return 0;
}

[질문1]
왜 num3, num4에 쓰레기값이 안담기는 걸까요? 선언만 하고 초기화 안하면 쓰레기값 담긴다고
배웠는데 쓰레기값이 안담기고 오류뜨고 자꾸 버벅거리기만해요..

[질문2]
그리고 제가 또 예제를 바꿔봤는데.. int 변수선언하고 초기화할때 여러개 변수를 선언 및 초기화 가능하잖아요? 그런데 한 문장에 변수선언 할거면 변수선언만 하고, 변수선언 +초기화 하려면 다 똑같은 성질만 세미콜론 앞에 붙여야하나요??

제가 너무 쉬운걸 질문했다면 죄송합니다.
근데 예제를 좀 변경해보면 실력이 는다기에 자꾸 변경해보는데
책에서 가르쳐주는것 이상으로 의문점이 많이생기네요. 제게 도움이 되는건 맞지만..세상에나
책도 벅찬데 괜히 .. 예제를 변경하나 싶기도 하네요 ㅜ.ㅜ

혹시 제게 변수선언과 초기화에대해 학습이 덜된 부분이 있다면 댓글로 지적해주셨으면 합니다.
프로그래머 선배분들도 열심히하시고 더 멋진 개발자 되시길 바랍니다!

한또르의 이미지

프로그램 흘러가는 과정에 보면 변수에 -8723721 막 이런숫자들이 담겨있을껀데 이런 값들을 쓰레기 값이라고 합니다.

개성만점의 이미지

책에서 2373789 뭐 이런 낯선 숫자들이 쓰레기값이라고 가르쳐주긴하던데 위의 코드를 컴파일해보면
콘솔창이 텅 비어있어요... 오류 생긴것같이..
제 컴퓨터가 이상한건지 ㅠ.ㅠ;;
그런데 제가 아직 디버깅은 안배웠거든요..디버깅은 어떻게하는건지 잘 모르고 아직 문법공부만 하고있어서
잘 모르겠지만 ㅜ_ㅜ..예제를 좀 더 파보겠습니다 감사합니다 ^^

세벌의 이미지

구글에서 디버깅 쳐 보시면 많이 나옵니다.
gdb도 있고...

Necromancer의 이미지

오류뜨는건 ide의 디버깅 기능입니다.
예제로 쓴 거 정도는 요즘은 어지간한 ide에서 다 잡습니다.
ide의 기능에 따라 컴파일시 warning 나올수도 있지만 error로 잡을 수도 있고요. 강제로 release 모드 컴파일 실행하면 이상한 값이 나올겁니다.

Written By the Black Knight of Destruction

 의 이미지

예제를 한번 바꿔서 컴파일해보라고 조언했던 답변자입니다.

https://kldp.org/node/157335

1. 교재에서 하지 말라고 한 건 예외입니다. 하지 말라면 일단 하지 마세요.

대부분의 경우, 좋은 교재에서 하지 말라고 한 데에는 이유가 있습니다. 그리고 그 이유를 설명하는 건 대체로 정말 어렵습니다.

초기화하지 않은 변수의 값을 읽으면 왜 안될까요?
쓰레기값이 읽혀서라는 건 아주 간략화된 설명입니다.
좀 더 정확하게 설명드리면, "어떤 일이 생길지 아무도 장담해주지 않아서"입니다.

C언어는 올바른 프로그램이 어떻게 동작할지를 규정할 뿐, 올바르지 않은 프로그램이 어떻게 동작할지에 대해서는 거의 말해주지 않습니다.
초기화되지 않은 변수의 값에 의존하는 프로그램은 올바르지 않은 프로그램의 대표적인 예입니다.
그런 프로그램이 일반적으로 어떻게 동작할지 예측하는 건 가능하지도 않고 별로 의미도 없습니다.

컴퓨터 및 프로그램의 동작 원리에 대해 깊히 이해하고 있다면, 어떤 일이 일어나는지 분석하거나, 심지어 자신에게 유리한 방향으로 이용하는 게 가능하기는 합니다. (해킹을 할 때 종종 그러지요.)
하지만 이건 초보자의 수준을 넘는 일입니다. 언젠가는 그 정도 수준에 도달하실 수 있겠지만, 일단은 아닐 겁니다.

2. 문제를 제대로 파악하는 법을 연습하세요.

아시겠지만, 혹은 곧 아시게 되겠지만, 질문자님이 짠 프로그램이 질문자님의 의도대로 동작하지 않을 이유는 그야말로 무궁무진하게 다양할 수 있습니다.

도대체 무슨 이유로 문제가 발생했는지 알아내려면 최대한 단서를 끌어모아야지요.

Quote:
버그가 생겼다그러고 비주얼스튜디오가 자꾸 멈칫멈칫 해서 자꾸 끄고키고 반복했습니다.

Quote:
오류뜨고 자꾸 버벅거리기만해요..

질문자님이 파악하신 단서가 이 정도 수준에 불과하다면 할 수 있는 게 아무것도 없습니다.
비주얼 스튜디오 등 컴파일러가 어떤 식으로든 메시지를 주었다면, 읽어 보시기는 하셨나요?
최소한 그 내용을 여기에 올려 주셨다면 다른 분들이 보시고 도움을 드릴 수 있었을 텐데요.
이 정도로 간단한 프로그램에서 컴파일러 메시지가 주는 힌트는 거의 결정적이라고 보셔도 좋을 겁니다.

질문자님은 이제 엔지니어링의 길을 걷기 시작하신 겁니다.
경험과 지식이 아직 충분하지 않은 거야 어쩔 수 없더라도, 엔지니어링에 걸맞는 사고 방식을 갖추셔야지요.
그냥 "버벅 버버버벅거리면서 막 오류 뜨고 안돼요 ㅜㅜ" 수준에 머물러서는 전혀 발전이 없을 뿐더러, 숙련자의 도움을 받기도 어렵게 됩니다.

개성만점의 이미지

제가 이제 갓 입문을 시작했다고해서 저 스스로 너무 절 관대하게 생각했던것 같습니다.
평생 제가 컴퓨터를 끼며 살면서 '에러'라는걸 접했을때 했던 행동들이 여기서 드러나는 것 같습니다.
무슨 오류가뜨거나 에러가 생겼다고 메시지가 뜨면 그냥 당황해서 주변에 아는사람들에게 도움받기 바빴던 지난날이 생각납니다. 현실적인 조언 정말 감사드리고 다음번엔 조금~더 수준이 있는 질문을 하도록 노력하겠습니다.
정말 감사합니다

댓글 달기

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