Почему strlen()
не проверяет наличие NULL?
если я делаю strlen(NULL)
, это приведет к сбоям.
Попытка понять логическое обоснование (если оно есть).
Почему strlen()
не проверяет наличие NULL?
если я делаю strlen(NULL)
, это приведет к сбоям.
Попытка понять логическое обоснование (если оно есть).
Рациональное позади это просто - как вы можете проверить длину чего-то, чего не существует?
Кроме того, в отличие от "управляемых языков" нет ожиданий, что система времени выполнения корректно обрабатывает неверные данные или структуры данных. (Этот тип проблемы является именно тем, почему более "современные" языки более популярны для не-вычислений или менее требовательных приложений).
Стандартный шаблон в c будет выглядеть так:
int someStrLen;
if (someStr != NULL) // or if (someStr)
someStrLen = strlen(someStr);
else
{
// handle error.
}
Часть языка стандарт, который определяет состояние библиотеки обработки строк, которые, если не указано иное для конкретной функции, должны иметь любые аргументы указателя допустимые значения.
Философия, стоящая за дизайном стандартной библиотеки C, заключается в том, что программист в конечном итоге находится в лучшем положении, чтобы знать, действительно ли нужно выполнять проверку времени выполнения. В те дни, когда ваша общая системная память была измерена в килобайтах, накладные расходы на выполнение ненужной проверки времени выполнения могли быть довольно болезненными. Поэтому стандартная библиотека C не беспокоится о выполнении любой из этих проверок; он предполагает, что программист уже сделал это, если это действительно необходимо. Если вы знаете, что никогда не передадите значение плохого указателя на strlen
(например, вы передаете строковый литерал или локально выделенный массив), тогда нет необходимости загромождать полученный двоичный код с ненужной проверкой против НОЛЬ.
Маленький макрос, чтобы помочь вашему горе:
#define strlens(s) (s==NULL?0:strlen(s))
Стандарт не требует этого, поэтому реализации просто избегают теста и потенциально дорогого перехода.
size_t strlen ( const char * str );
http://www.cplusplus.com/reference/clibrary/cstring/strlen/
Strlen принимает указатель на массив символов в качестве параметра, значение null не является допустимым аргументом для этой функции.
Три существенные причины:
Стандартная библиотека и язык C разрабатываются с учетом того, что программист знает, что делает, поэтому нулевой указатель не рассматривается как регистр, а скорее как ошибка программиста, которая приводит к undefined поведение;
Это приводит к чрезмерной нагрузке во время выполнения - вызов strlen
тысяч раз и всегда выполнение str != NULL
нецелесообразно, если программист не рассматривается как sysy;
Он добавляет размер кода - это может быть только несколько инструкций, но если вы примете этот принцип и сделаете его всюду, он может значительно раздуть ваш код.