объявить переменную char в c ++, зачем добавлять 1 для объявления размера массива

Есть пословица, когда мы объявляем переменную типа char.

Мы должны так заявить - ›char ArrayName[Maximum_C-String_Size+1];

Например:

char arr[4+1] = {'a', 'b', 'c', 'd'}

но arr[4] = {'a', 'b', 'c', 'd'} тоже работает

зачем нужно прибавлять 1? Благодарность!


person 黃翊唐    schedule 22.09.2020    source источник
comment
Вам нужно добавить 1, если вы планируете рассматривать arr как строку с завершающим нулем. Дополнительный элемент должен хранить, ну, терминатор NUL.   -  person Igor Tandetnik    schedule 22.09.2020
comment
Конечная строка символа '\ n'   -  person Anton Golovenko    schedule 22.09.2020
comment
Если вы нашли учебник или книгу, в которой используется arr[4+1], прекратите использовать этот учебник или книгу и найдите лучший.   -  person Ken White    schedule 22.09.2020


Ответы (2)


В этом нет необходимости, если только вы не определяете что-то, что будет использоваться как строка с завершающим нулем.

// these two definitions are equivalent
char a[5] = { 'a', 'b', 'c', 'd' };
char b[5] = { 'a', 'b', 'c', 'd', '\0' };

Если вам нужен только массив с 4 значениями символов в нем, и вы не будете использовать его с чем-либо, что ожидает найти терминатор строки, вам не нужно добавлять дополнительный элемент.

person paddy    schedule 22.09.2020

Если вы храните строку в стиле C в массиве, вам понадобится дополнительный элемент для терминатора строки.

В отличие от C ++, C не имеет уникального строкового типа данных. В C строка - это просто последовательность символьных значений, включая нулевой терминатор. Строка "foo" представлена ​​как последовательность {'f','o','o',0}. С помощью этого терминатора различные функции обработки строк узнают, где заканчивается строка. Терминатор не является печатаемым символом и не учитывается в длине строки (strlen("foo") возвращает 3, а не 4), однако вам необходимо выделить место для его хранения. Итак, если вам нужно сохранить строку длиной N символов, тогда массив, в котором она хранится, должен иметь ширину не менее N + 1 элементов, чтобы учесть терминатор.

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

person John Bode    schedule 22.09.2020