지역변수의 초기화 문제입니다.

ktd2004의 이미지

새해 복 많이 받으세요..

헷갈리는 부분이 있어 확실히 하고자 질문드립니다.
질문은 다음과 같습니다. 다음 코드의 모든 변수는 지역변수입니다.
각 지역변수가 어떤 값으로 초기화되는지요?

int first[100];                   // 1번.
int second[100] = {3};   // 2번.
int third[100] = {3,};      // 3번.

제 기억으로는(예전에 터보 C 완벽가이드에서 본 기억으로는)

1번 : 초기화되지 않음.
2번 : 초기화됨. 그런데 100개의 배열이 전체 다 초기화 되나요?
3번 : 초기화됨. 그리고 ","로 인해서 뒤쪽의 배열(99개)도 같은 값으로 최기화됨.

으로 알고 있었습니다.

그런데 테스트를 해보니(gcc -v 4.0.2)

1번 : 초기화되지 않음.
2번 : 배열의 첫번째 요소만 3, 나머지는 0으로 초기화됨.
3번 : 2번과 마찬가지로, 첫번째 요소는 3, 나머지는 0으로 초기화됨.

그래서 지역변수를 초기화하기 위해 다음과 같은 코드를 사용했습니다.

int first[100];
memset( first, 0, sizeof(first));

위 코드도 나름대로 괜찮은 것 같습니다.
그런데 0이 아닌 다른 값으로 초기화해야할 땐...

그래서 질문은 다음과 같습니다.
1. 위에서 언급한 3가지의 지역변수의 초기화방법에 대한 표준에서 정의된 결과는?
2. 배열 형태의 지역변수를 초기화(0 혹은 다른 값들)하는 가장 좋은 방법은?

저녁 맛있게 드십시오..

IDNed의 이미지

결과부터 말씀드리면 GCC가 표준에 맞게 자기 일을 하는겁니다 -_-

1번 : 스택 지역변수면 성능 측면 땜시 초기화 안됩니다.
2번 : 정한데까지 초기화하고 나머지는 대략 기본생성자(즉 int() )로 초기화됩니다.
3번 : 2번과 같지만 끝의 콤마로 "이게 끝이 아니다"를 명시해주는, 일명 조은 코딩 스타일-_-

초기값 지정은 노가다 빼고는 방법이 없을 겁니다. -_-

익명 사용자의 이미지

위에 분이 적어주신 대로, gcc가 올바른 동작을 하고 있는 것입니다. ','가 있건 없건 차이점은 없으며, 2번과 3번에 차이점은 없습니다.

0 외의 다른 값으로 모두 초기화를 시키는 방법은, 노가다로 다 적어주던가 혹은 for 문을 이용해서 일일이 써주는 방법밖에 없습니다.

C++이라면 템플릿을 이용한 뭔가 멋진 방법이 있을수도 있겠습니다만, 대신 코드의 크기는 무진장 커지겠지요.

익명 사용자의 이미지

template meta programming하면 code bloating 안생겨야 정상입니다.
컴파일 타임에 계산이 돼서 값으로 치환 되거든요.

template을 쓰려면 값에 재귀적으로 적용시킬 수 있는
규칙성이 있어야 합니다.

그런 규칙성이 없다면
코드 제너레이터를 만드세요.

댓글 달기

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