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으로 초기화됩니다.
그건 아니죠..
{}도 만약 문법적으로 initialization list로 허용해 준다면,
위에서 인용된 c99 표준에 따라 static storage duration을 갖는 개체와 동등하게 초기화 되는거죠.
즉 어떤 local 블록 내에서 char a[10] = {0};과 char a[10] = {}; 는 같은 동작을 하게 되는겁니다.
(실제로 gcc에서는 extension으로서 위의 두 statement가 동등합니다)
{}는 빈 배열이라는 의미이고 ""는 빈
{}는 빈 배열이라는 의미이고
""는 빈 문자열(null로 끝나는 char 배열)입니다.
Quote: 6.7.8
char[]를 {}로 초기화하는 것은 C 표준이 아닙니다. {} 안에 적어도 하나 이상의 원소가 있어야 합니다.
char[]를 ""로 초기화하는 것은 C 표준입니다.
문자열 또는 {} 내의 원소의 개수가 초기화하려는 배열의 총 원소 개수보다 적으면, 나머지 부분은 암시적으로 해당 타입이 static으로 초기화될 때와 같은 방식으로 초기화됩니다.
이 때 static과 같은 방식으로 초기화된다는 것은 이렇습니다.
즉, static 기억 주기를 갖는 객체들은 명시적으로 초기화되지 않은 경우 0 또는 NULL 등으로 초기화됩니다.
즉, char[]을 ""로 초기화하면 문자열의 끝을 나타내기 위해 첫번째 원소가 '\0'으로 초기화되고, 나머지 부분도 위의 규칙에 따라 0으로 초기화됩니다.
반면, char[]을 {}로 초기화하는 것은 C의 표준을 따르는 것이 아닙니다.
char[0x28] = { 0 }; 으로 고치면 모두 0으로 초기화됩니다.
인용하신 원문만 보아서는 "{} 안에 적어도 하나
인용하신 원문만 보아서는 "{} 안에 적어도 하나 이상의 원소가 있어야 합니다." 라는 말씀에 해당하는 부분이 없는 것 같은데요, 혹시 출처좀 알 수 있을까요?
인용하신 c99 6.7.8절 원문을 찾아서 보니
인용하신 c99 6.7.8절 원문을 찾아서 보니 애초에 grammar에서 {}를 허용하지 않네요.
{}는 초기화가 아니니까요. 그걸 초기화라고 한다면
{}는 초기화가 아니니까요.
그걸 초기화라고 한다면 초기화의 태극권쯤 되겠군요... ㅋ
아무것도 하지 않음을 행하라 ㅎㅎ
그건 아니죠.. {}도 만약 문법적으로
그건 아니죠..
{}도 만약 문법적으로 initialization list로 허용해 준다면,
위에서 인용된 c99 표준에 따라 static storage duration을 갖는 개체와 동등하게 초기화 되는거죠.
즉 어떤 local 블록 내에서 char a[10] = {0};과 char a[10] = {}; 는 같은 동작을 하게 되는겁니다.
(실제로 gcc에서는 extension으로서 위의 두 statement가 동등합니다)
네,
네, 말씀대로입니다.
gcc에서 이렇게 확인해 볼 수도 있습니다.
댓글 달기