Ваш вопрос примерно эквивалентен следующему:
Я знаю, что охранная сигнализация должна предотвратить ограбление вашего дома.Этим утром, когда я вышел из дома, я выключил охранную сигнализацию.Когда-то днем, когда меня не было, ворвался грабитель и украл мои вещи.Как это произошло?
Или вот что:
Я знаю, что вы можете использовать круиз-контроль на своей машине, чтобы помочь вам избежать получения штрафов за превышение скорости.Вчера я ехал по дороге, где ограничение скорости составляло 65. Я установил круиз-контроль на 95. Полицейский остановил меня, и я получил штраф за превышение скорости.Как это случилось?
На самом деле, это не совсем правильно.Вот более надуманная аналогия:
Я живу в доме с 10-метровой дорогой на улицу.Я научил свою собаку приносить мою газету.Однажды я позаботился о том, чтобы на дороге не было газет.Я положил свою собаку на 39-метровый поводок и сказал ему принести газетную башню.Я ожидал, что он пойдет до конца поводка, 39 ярдов.Но вместо этого он прошел всего 10 ярдов и остановился.Как это случилось?
И, конечно, есть много ответов.Возможно, когда ваша собака добралась до конца вашей дороги без газет, она сразу же нашла чужую газету в канаве.Или, может быть, когда поводок не смог остановить его в конце проезжей части, и он продолжил движение по улице, его сбила машина.
Смысл повесить собаку на поводке - ограничить егов безопасный район - в этом случае ваша собственность, которую вы контролируете.Если вы положите его на такой длинный поводок, что он сможет уйти на улицу или в лес, вы как бы побеждаете цель контролировать его, ставя его на поводок.
Точно так же весь смысл strnlen
в том, чтобы вести себя изящно, если в указанном вами буфере нет нулевого символа для strnlen
, который нужно найти.
Проблема со строками, не оканчивающимися нулем, заключается втакие функции, как strlen
(которые слепо ищут нулевые терминаторы) уходят с конца и слепо копаются в неопределенной памяти, отчаянно пытаясь найти терминатор.Например, если вы скажете
char non_null_terminated_string[3] = "abc";
int len = strlen(non_null_terminated_string);
, поведение не определено, потому что strlen
плывет с конца.Один из способов исправить это - использовать strnlen
:
char non_null_terminated_string[3] = "abc";
int len = strnlen(non_null_terminated_string, 3);
Но если вы передадите большее число на strnlen
, это победит всю цель.Вы снова задаетесь вопросом, что произойдет, когда strnlen
уйдет с конца, и нет никакого способа ответить на это.