Стрлен возвращает необоснованный номер

Если я напишу:

char  lili [3];
cout<<strlen(lili)<<endl;

то, что напечатано: 11

но если я напишу:

char  lili [3];
lili [3]='\0';
cout<<strlen(lili)<<endl;

тогда я получаю 3.

Я не понимаю, почему он возвращает 11 в первой части?
Не должен ли он возвращать 3, поскольку я выделил 3 символа дляlili?

 Steve Jessop27 июн. 2012 г., 11:19
Мусор на входе, мусор на выходе. Как объясняют ответы, если вы передадите необоснованный ввод в функцию, вы можете получить необоснованный вывод.

Ответы на вопрос(4)

Решение Вопроса

strlen работает с "C-стилем" завершенные нулем строки. Если вы дадите ему простой указатель или неинициализированный буфер, как вы делали в первом примере, он будет продолжать проходить по памяти, пока не найдет\0в этот момент он будет возвращать длину этой «строки» или b) до тех пор, пока не достигнет защищенной области памяти и не выдаст ошибку.

Учитывая, что вы пометили этот C ++, возможно, вам стоит подумать об использованииstd::array или еще лучше,std::string, Оба предоставляют функции, возвращающие длину (size()) и оба имеют некоторую дополнительную логику проверки диапазона, которая поможет предотвратить попадание вашего кода в неинициализированные области памяти, как вы это делаете здесь.

учае в нем есть случайные данные.

strlen ищет знак завершения строки и будет считать, пока не найдет его.

пока оно не достигнет «\ 0». (что обозначает «конец строки»). В C и C ++ char [] эквивалентен char *, а strlen используетlili в качестве указателя на тип char и выполняет итерацию памяти, на которую он указывает, до тех пор, пока она не достигнет завершающего символа \ 0. Так уж получилось, что в памяти было 0 байт, 11 байтов из памяти, выделенной для вашего массива. Вы могли бы получить гораздо более странный результат.

На самом деле, когда вы пишете lili [3] = '\ 0' apos; вы получаете доступ к памяти вне вашего массива. Допустимые индексы для трехэлементного массива в C / C ++ - 0-2.

strlen функция ищет байт, установленный в\0, Если вы запускаете его в неинициализированном массиве, то поведение не определено.

Ваш ответ на вопрос