Нулевой символ вставляется автоматически?

0

Предполагается ли, что компилятор C++ автоматически вставляет нулевой символ после окончания массива char? Следующие отпечатки "Слово". Так компилятор C++ автоматически вставляет нулевой символ в последнюю позицию в массиве?

int main()
{
    char x[] = {'W', 'o', 'r', 'd'};
    cout << x << endl;
    return 0;
}
  • 0
    На всякий случай, если кто-то новичок в c ++ и прочитает это, использование std::string избавит вас от множества неопределенных проблем поведения, подобных этой.
Теги:
string
arrays
initialization
string-literals

7 ответов

5

Нет, нет. Ваш массив x имеет только 4 элемента. Вы передаете std::cout указатель на char, который не является началом строки с нулевым завершением. Это неопределенное поведение.

Например, на моей платформе аналогичный код печатал Word? , с ложным вопросительным знаком.

  • 0
    Я тоже запускал код, и теперь я застрял с хроническими носовыми демонами. Благодарю. :(
4

В 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";
3

Это неопределенное поведение, и оно напечатало "Слово", так как оно также могло потерпеть крах.

1

Нет, нет. Вы сами должны это сделать, если хотите использовать его как строку или хотите использовать для этого функции библиотеки для строк.

1

Нет, нет. Если вы хотите, чтобы он был вставлен автоматически, используйте строчную константу:

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 с помощью отладчика и контролировать его и следующие несколько байтов после него. Остановите отладчик после инициализации и проверьте содержимое памяти.

0

Нет, в этом случае вы просто создаете массив с нулевым завершением. В случае чтения, основанного на нулевом завершении. Ваша программа не остановится, так как она не найдет нуль.

char x[] = "Word";

В этом случае для x будет выделено 5 байт. Нуль в конце.

0

Нет, если вы хотите использовать массив char в виде строки, используйте эту форму инициализатора

char x[] = { "Word" };

Ещё вопросы

Сообщество Overcoder
Наверх
Меню