char [0x28] ="" 와 char[0x28]={}의 차이점이 뭘까요?

준호의 이미지

안녕하세요? 문의 드릴께요.

char [0x28] ="" 와 char[0x28]={}의 차이점이 뭘까요?

어셈브릴 코드 보면 char[0x28] = "" 은 0x00으로 초기화를 한번 작업 하더군요.
후자는 그렇지 않던데요?

어떤 차이가 있을까요?

익명 사용자의 이미지

{}는 빈 배열이라는 의미이고
""는 빈 문자열(null로 끝나는 char 배열)입니다.

amorette의 이미지

Quote:

6.7.8 Initialization

21 If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.

char[]를 {}로 초기화하는 것은 C 표준이 아닙니다. {} 안에 적어도 하나 이상의 원소가 있어야 합니다.
char[]를 ""로 초기화하는 것은 C 표준입니다.

문자열 또는 {} 내의 원소의 개수가 초기화하려는 배열의 총 원소 개수보다 적으면, 나머지 부분은 암시적으로 해당 타입이 static으로 초기화될 때와 같은 방식으로 초기화됩니다.

이 때 static과 같은 방식으로 초기화된다는 것은 이렇습니다.

Quote:

6.7.8 Initialization

10 If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static storage duration is not initialized explicitly, then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules;
— if it is a union, the first named member is initialized (recursively) according to these rules.

즉, static 기억 주기를 갖는 객체들은 명시적으로 초기화되지 않은 경우 0 또는 NULL 등으로 초기화됩니다.
즉, char[]을 ""로 초기화하면 문자열의 끝을 나타내기 위해 첫번째 원소가 '\0'으로 초기화되고, 나머지 부분도 위의 규칙에 따라 0으로 초기화됩니다.

반면, char[]을 {}로 초기화하는 것은 C의 표준을 따르는 것이 아닙니다.
char[0x28] = { 0 }; 으로 고치면 모두 0으로 초기화됩니다.

익명 사용자의 이미지

인용하신 원문만 보아서는 "{} 안에 적어도 하나 이상의 원소가 있어야 합니다." 라는 말씀에 해당하는 부분이 없는 것 같은데요, 혹시 출처좀 알 수 있을까요?

익명 사용자의 이미지

인용하신 c99 6.7.8절 원문을 찾아서 보니 애초에 grammar에서 {}를 허용하지 않네요.

익명 사용자의 이미지

{}는 초기화가 아니니까요.
그걸 초기화라고 한다면 초기화의 태극권쯤 되겠군요... ㅋ
아무것도 하지 않음을 행하라 ㅎㅎ

익명 사용자의 이미지

그건 아니죠..
{}도 만약 문법적으로 initialization list로 허용해 준다면,
위에서 인용된 c99 표준에 따라 static storage duration을 갖는 개체와 동등하게 초기화 되는거죠.
즉 어떤 local 블록 내에서 char a[10] = {0};과 char a[10] = {}; 는 같은 동작을 하게 되는겁니다.
(실제로 gcc에서는 extension으로서 위의 두 statement가 동등합니다)

amorette의 이미지

네, 말씀대로입니다.

Quote:
6.7.8 Initialization
 
Syntax
1
initializer:
  assignment-expression
  { initializer-list }
  { initializer-list , }
initializer-list:
  designationopt initializer
  initializer-list , designationopt initializer
(후략)

gcc에서 이렇게 확인해 볼 수도 있습니다.

$ echo 'int main(){ int arr[] = {}; }' > a.c ; gcc -ansi -pedantic a.c
a.c: In function ‘main’:
a.c:1: warning: ISO C forbids empty initializer braces
a.c:1: error: zero or negative size array ‘arr’

댓글 달기

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