배열 초기화(char arBuf[128] = {})에 대한 질문입니다.

초코리의 이미지

배열을 사용하다가 의문이 생겼습니다.

보통저는 배열을 선언하고 memset으로 초기화 하는 방법을 사용했습니다.

char arBuf[128];
memset(arBuf, 0x00, sizeof(arBuf));

그러다가 KLDP 검색중 cinsk님께서 쓰신 snprintf 관련 글중에
다음과 같은 배열 초기화 하는것을 봤습니다.

http://kldp.org/node/69784

char buf[LEN] = { 0, };

예제로 테스트하여서 GDB로 찍어보기 0으로 초기화가 되었습니다.

그래서 혹시나하고

char buf[LEN] = {1, };

도해봤습니다.
(gdb) x/32b arBuf1
0xbfaf3ea4:     0x01    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0xbfaf3eac:     0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0xbfaf3eb4:     0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0xbfaf3ebc:     0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
(gdb) run

위와같이 초기화 되는것을 확인 할수 있었습니다.
처음만 1로 초기화 되고 나머지는 0으로 초기화 되는것을 확인했습니다.

그래서

char buf[LEN] = {};

위와 같은 코드를 넣고 확인해보니
(gdb) x/32b arBuf1
0xbfde99a4:     0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0xbfde99ac:     0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0xbfde99b4:     0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0xbfde99bc:     0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
(gdb) quit

다음과 같은 코드로 초기화 한것과 동일하게 나오더군요..

memset(arBuf1, 0x00, sizeof(arBuf));

또 초기화에 대한 글을 찾아보고 있으니 다음과 같은 글타래에서
초기화에 대한 논의가 있었습니다.
http://kldp.org/node/31567
읽어보니 초기화 방법은 다양하고 최적화 했을때 성능차이는 미미하다라고
결론이 나는것 같습니다. (아니면 ㅡㅗㅡ:: 말씀해주세요 다시 읽어 보겠습니다.)

그래서 질문의 요지를 말하자면
초기화에는 각방법에 초기화에 문제가 없다면
다음과 같이 코딩하는데 제일 간편한 방법을 쓰고 싶습니다.

char arBuf[128] = {};

위코드가 arBuf를 0으로 초기화 하고
여러플래폼에서 사용가능한지 궁굼해서 질문올립니다..??

간단요약
배열을 0으로 초기화를 위해 쓴 다음 코드가 문제 없는 코드인가요??

char arBuf[128] = {};

M.W.Park의 이미지

c를 안쓴지가 너무 오래되어서 기억이 가물거립니다만, 0으로 값이 채워지는 것이 보장되는 곳은 heap(global variable) 영역이었던거같습니다.
stack(local variable)에서는 보장되지 않았던 것으로 기억합니다.

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

kewlbear의 이미지

TCPL 4.9 86페이지에 보면 자동 배열도 배열 크기에 비해 initializer가 모자라면 나머지는 0으로 된다고 나와있습니다.

초코리의 이미지

한글 2판 4.9 초기화 부분 119페이지에 나와있네요.

참고 하겠습니다.
답변 감사합니다.

익명사용자의 이미지

배열을 0으로 초기화를 위해 쓴 다음 코드가 문제 없는 코드인가요??
char arBuf[128] = {};

C++ : 문제없습니다. 표준에 언급되어 있습니다.

C : 문제있습니다. 언급되어 있는지 모르겠지만, 허용되지 않는 거 같습니다.

gcc 에서 -ansi -pedantic 로 돌려보시면 warning 뜹니다.

warning: ISO C forbids empty initializer braces

초코리의 이미지

표준문서를 좀 찾아봐야 겠네요.. 답변 감사합니다.

댓글 달기

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