Как правило, бессмысленно обсуждать, почему неопределенное поведение приводит к тому или иному результату.
Но, возможно, не вредно пытаться понять, почему что-то происходит, даже если это выходит за рамки спецификации.
Существует реализация isalpha
, в которой используется простой массив для поиска всех возможных значений unsigned char
.В этом случае значение, переданное в качестве параметра, используется в качестве индекса в массиве.В то время как реальный символ ограничен 8 битами, целое число - нет.Функция принимает int
в качестве параметра.Это позволяет также вводить EOF
, который не вписывается в unsigned char
.
Если вы передаете адрес, такой как 0x7239482342, в вашу функцию, это далеко за пределами указанного массива, и когда процессор пытаетсячтобы прочитать запись с этим индексом, он падает с края света.;)
Вызов isalpha
с таким адресом - это место, где компилятор должен выдать предупреждение о преобразовании указателя в целое число.Что вы, вероятно, игнорируете ...
Библиотека может содержать код, который проверяет допустимые параметры, но он также может просто полагаться на то, что пользователь не передает вещи, которые не должны быть переданы.