Это действительное утверждение C? - PullRequest
6 голосов
/ 01 января 2011

Допустим, я пишу char c[99] = {'Stack Overflow'}; на C или C ++.Он хорошо компилируется, но так ли это?Под действительным я имел в виду не вызывать какого-либо неопределенного или неопределенного поведения.

Опять же, если я напишу char c[99] = 'Stack Overflow';, gcc жалуется на константу с несколькими символами, что очевидно, но выше, когда я заключаю в фигурные скобки, компилятор рад!Почему это так?

Я также заметил, что puts(c); после первого оператора выведет 'w' точно последний символ общей строки вместо Stack Overflow.Почему так?

Может ли кто-нибудь объяснить это поведение отдельно?

Ответы [ 2 ]

14 голосов
/ 01 января 2011

Они оба являются только одним литералом, поэтому c[0] устанавливается равным литералу, а c[1] ... c[98] заполняется нулем (символ NUL).

Я думаю, что значение на самом деле вставляется в c[0] зависит от реализации, но оно должно по крайней мере компилироваться на любом совместимом компиляторе.

РЕДАКТИРОВАТЬ: проверено на соответствие стандарту, по крайней мере, в C ++ 0x:

Литерал с несколькими символами имеет тип int и значение, определяемое реализацией.

А в C99 (используя черновик , потому что это бесплатно):

Значение целочисленной символьной константы, содержащей более одного символа (например, 'ab') или содержит символ или escape-последовательность, которая не отображается в однобайтовый символ выполнения, определяется реализацией.

1 голос
/ 01 января 2011

Согласовано - в коде ядра Windows - вы видите много тегов памяти.И это на самом деле реализовано для каждой платформы.Однако они используют ULONG для пометки памяти, и это всегда 4-символьный литерал в обратном порядке: ULONG tagMemory = 'kscf';

Интерпретация зависит от платформы, но представляет собой поток символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...