Как инициализировать массив символов без нулевого терминатора? - PullRequest
3 голосов
/ 13 мая 2019

Массив char является частью сетевого сообщения, которое имеет четко определенную длину, поэтому нулевой терминатор не нужен.

struct Cmd {
    char cmd[4];
    int arg;
}

struct Cmd cmd { "ABCD" , 0 }; // this would be buffer overflow

Как я могу инициализировать этот массив символов члена cmd? без использования таких функций, как strncpy?

1 Ответ

8 голосов
/ 13 мая 2019

Завершающий нулевой символ игнорируется, если размер массива char совпадает с количеством символов в инициализаторе. Так что cmd не будет иметь нулевого терминатора.

Соответствующий раздел в стандарте C11 (n1570): 6.7.9 / 14 :

Массив символьного типа может быть инициализирован символьным строковым литералом или строковым литералом UTF-8, необязательно заключенным в фигурные скобки. Последовательные байты строкового литерала (, включая завершающий нулевой символ , если есть место или массив неизвестного размера), инициализируют элементы массива.

И утверждение:

struct Cmd cmd { "ABCD" , 0 };

должно быть:

struct Cmd cmd  = { "ABCD" , 0 };
...