Инициализация массива C char с использованием фигурных скобок, можно ли пропустить нулевой байт '\ 0'? - PullRequest
3 голосов
/ 26 февраля 2011

Итак, я прочитал это:

char pattern[] = "ould";

в основном более простой способ написания:

char pattern[] = { 'o', 'u', 'l', 'd', '\0' };

Я понимаю, что нулевой символ \0 отмечает конец строки, но что, если я напишу это так:

char pattern[] = { 'o', 'u', 'l', 'd'}; (без \ 0)

Он все еще компилируется.

Где pattern без \0 вызовет проблемы, потому что он, кажется, компилируется без предупреждений (-Wall)

Ответы [ 8 ]

10 голосов
/ 26 февраля 2011

Если вы пропустите завершающий ноль, у вас больше не будет нулевой завершенной строки, а будет только массив char, поэтому передача его любой функции, которая ожидает строку, будет ошибкой. Например. strlen, в качестве параметра источника для strcpy, в качестве параметра ... для printf с указателем формата %s и т. Д.

3 голосов
/ 26 февраля 2011

Что не так с этим поведением? Вполне допустимо иметь массив символов без '\ 0' в конце. Это просто массив. Единственная причина, по которой существует \ 0, - это разделение строки. Если вы знаете, какая длина, вам это не нужно!

Массивы Char не отличаются от других массивов. Единственное, для чего вам нужно '\ 0' - это стандартные строковые функции.

2 голосов
/ 26 февраля 2011

это не вызовет проблем с компилятором, где это может вызвать проблемы из-за того, что многие функции, например printf, предполагают, что когда вы передадите что-то с помощью спецификатора формата% s, оно будет прервано '\ 0'.

Но если вы передаете только этот массив в функции, которые вы пишете, или когда вы передаете длину массива в качестве отдельного параметра, и все они знают, как долго это не вызовет проблем.

2 голосов
/ 26 февраля 2011

Это не предупреждение компилятора, а логическое. Если вы используете strcpy без \0, вы потенциально можете испортить свой стек.

1 голос
/ 26 февраля 2011
char string[] = "abcd"; /*is valid at the end is the \0, 5 chars were allocated*/

char str[3] = {'\0'}; /* all are \0 */

strncpy(str, string, 2); /*strcpy doesn't add \0*/

str[3] = '\0'; /* now is everything fine! */
1 голос
/ 26 февраля 2011

Например, получение длины строки приведет к непредсказуемым результатам.
strlen(pattern)

1 голос
/ 26 февраля 2011

Конечно, он компилируется - это действительная программа на Си. Проблемы могут возникнуть, если вы попытаетесь передать свой массив символов в функцию, ожидающую строку с нулем в конце (массив символов, заканчивающийся на '\ 0').

1 голос
/ 26 февраля 2011

Это проблема, если когда-либо вы рассматриваете это как строку. Например, используя strcmp, strcpy, printf. Все они ожидают найти нулевой терминатор, поэтому определенно столкнутся с проблемами.

Обычный старый массив символов в порядке, если только вы рассматриваете его как массив символов. например

char c = pattern[2];
...