[C] 복잡한 구조체의 초기화

gurumong의 이미지

구조체가 맴버로 다른 구조체를 가지고 있어도 아래와 같은 초기화로
모든 맴버의 구조체들도 0의 값으로 초기화가 된다고 보장되나요?

struct t = {0, 0, 0, 0, {0, }, {0, {0, }}, 0};
struct t = {0, }; // 같은 코드?

다른 질문으로 memset으로 구조체의 메모리를 모두 0으로 초기화 하는것은
맴버로 포인터를 가지고 있다면 포인터를
(널포인터가 아닌) 의미없는 쓰레기값으로 초기화 하게 되는데
이때 어떤 문제가 발생할수있는지요?

책만 보면서 공부하다가 뭘좀 해보려니까
밑바닥 지식이 완전히 드러나네요 ㅜ.ㅜ

irondog의 이미지

struct를 지역(스택) 변수로 선언 했을 때를 말씀하시는듯 합니다.
(어차피 광역변수는 초기화가 되는 곳이니까 패스~)

예제 코드가 말이 안되는듯 해서 제가 코드를 좀 수정해서 말씀 드리겠습니다.

struct _t t = {0, }; // 같은 코드?

다시 말해서 위에서처럼 선언하면 struct 모든 변수가 0으로 셋팅 되느냐는 질문이신듯 한데...
컴파일러가 하는 일이라 컴파일러마다 결과가 다를 수 있습니다.
하지만 새로운 표준에서는 초기화 되는게 맞습니다.
struct _t t = {}; 이렇게만 해도 모두 0으로 초기화 됩니다. 초기화가 보장 되는 것이지요.
그리고 포인터 변수 역시나 NULL값이 들어가겠죠.

보충 설명 하자면 c99을 따르는 컴파일러는 아래 예제에서 처럼 초기화 가능하고
특정 변수 지정을 안하면 모두 0 값이 들어 가도록 되어 있습니다.

function()
{
       struct FOO {int a,b,c};
       struct FOO foo = {.b=22};
 
       printf("%d %d %d\n", foo.a, foo.b, foo.c);
}

결과는
0 22 0

전웅의 이미지

> 구조체가 맴버로 다른 구조체를 가지고 있어도 아래와 같은 초기화로
> 모든 맴버의 구조체들도 0의 값으로 초기화가 된다고 보장되나요?
>
> struct t = {0, 0, 0, 0, {0, }, {0, {0, }}, 0};
> struct t = {0, }; // 같은 코드?

네, 초기치가 1개라도 있으면 나머지는 0 이 주어진 것과 같습니다.
(중괄호는 있으나 초기치가 없는 것은 문법 오류입니다)

> 다른 질문으로 memset으로 구조체의 메모리를 모두 0으로 초기화 하는것은
> 맴버로 포인터를 가지고 있다면 포인터를
> (널포인터가 아닌) 의미없는 쓰레기값으로 초기화 하게 되는데
> 이때 어떤 문제가 발생할수있는지요?

다수의 환경에서 all-bit-zero 는 널 포인터의 표현으로 쓰이지만,
말씀하신대로 그렇지 않은 환경이 있을 수 있습니다. 그런 환경에서는
다양한 일들이 발생할 수 있습니다 - 간단히는 초기화하지 않은 포인터를
사용하는 것과 다르지 않다고 생각하시면 됩니다.

memset(0) 으로 특정 변수를 바이트 단위로 초기화하는 경우,
- 정수형은 0 이 보장됩니다
- 부동형은 0.0 이 보장되진 않지만 현존하는 모든 시스템에서 0.0 입니다.
- 포인터는 널 포인터가 보장되지 않습니다.
(빼먹은 타입 없죠? ^^)

하지만, 알고 계시겠지만 0 은 정수 상수인 동시에 널 포인터 상수
(null pointer constant)이기 때문에 포인터로 대입되거나 포인터를
초기화하는 경우 정상적인 널 포인터로 만든다는 것이 보장됩니다.
따라서 memset() 이 아닌 위와 같은 초기화에서는 포인터 멤버는
널 포인터로 초기화된다는 것이 보장됩니다.

> 책만 보면서 공부하다가 뭘좀 해보려니까
> 밑바닥 지식이 완전히 드러나네요 ㅜ.ㅜ

겸손의 말씀을... ^^
날 더운데 화이팅입니다!

--
Jun, Woong (woong.jun at gmail.com)
Web: http://www.woong.org (서버 공사중)

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

댓글 달기

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