Предполагается ли, что компилятор C++ автоматически вставляет нулевой символ после окончания массива char? Следующие отпечатки "Слово". Так компилятор C++ автоматически вставляет нулевой символ в последнюю позицию в массиве?
int main()
{
char x[] = {'W', 'o', 'r', 'd'};
cout << x << endl;
return 0;
}
Нет, нет. Ваш массив x
имеет только 4 элемента. Вы передаете std::cout
указатель на char
, который не является началом строки с нулевым завершением. Это неопределенное поведение.
Например, на моей платформе аналогичный код печатал Word?
, с ложным вопросительным знаком.
В C/C++ строковые литералы автоматически добавляются с завершением нулевого значения. Так что, если вы напишете, например
char x[] = "Word";
то размер массива будет равен 5, а последний элемент массива будет содержать "\ 0".
Когда следующая запись используется, как вы показали
char x[] = {'W', 'o', 'r', 'd'};
то компилятор выделяет ровно столько же элементов, сколько и число инициализаторов. То есть в этом случае массив будет содержать только 4 элемента.
Однако, если вы напишете следующий путь
char x[5] = {'W', 'o', 'r', 'd'};
то пятый элемент будет содержать оканчивающийся нуль, потому что он не имеет соответствующего инициализатора и будет инициализирован нулем.
Также учтите, что следующая запись действительна в C, но недействительна в C++
char x[4] = "Word";
Это неопределенное поведение, и оно напечатало "Слово", так как оно также могло потерпеть крах.
Нет, нет. Вы сами должны это сделать, если хотите использовать его как строку или хотите использовать для этого функции библиотеки для строк.
Нет, нет. Если вы хотите, чтобы он был вставлен автоматически, используйте строчную константу:
const char *x = "Word";
//OR
std::string const s = "Word";
const char *x = s.c_str();
//OR
char x[] = { "Word" }; //using the C++11 brace initializer syntax.
Самый простой способ проверить это - посмотреть адрес памяти для x с помощью отладчика и контролировать его и следующие несколько байтов после него. Остановите отладчик после инициализации и проверьте содержимое памяти.
Нет, в этом случае вы просто создаете массив с нулевым завершением. В случае чтения, основанного на нулевом завершении. Ваша программа не остановится, так как она не найдет нуль.
char x[] = "Word";
В этом случае для x будет выделено 5 байт. Нуль в конце.
Нет, если вы хотите использовать массив char
в виде строки, используйте эту форму инициализатора
char x[] = { "Word" };
std::string
избавит вас от множества неопределенных проблем поведения, подобных этой.