с не содержит нулевых символов. Как ptr получает длину?
Это не так. Кажется, он дает правильный ответ в ваших тестах, потому что ячейка памяти, следующая за адресом c
, содержит нулевой байт. Это местоположение не определено, чтобы содержать нуль, и программа не имеет доступа к нему, поэтому вы не можете рассчитывать на то, что такой код продолжает работать.
В языке стандарта C, поведение программы является неопределенным, что означает, что не только является результатом операции непредсказуемой, the entire program is rendered meaningless.
Даже без учета неопределенного поведения, указанное код может перестать работать с малейшим изменением - например, при изменении архитектуры, компилятора или даже флагов компиляции или при добавлении дополнительных функций в микс. Хотя такие фрагменты кода могут быть полезны для изучения того, как материал работает под капотом, они никогда не должны использоваться в производственном коде.
«У моего кода есть ошибка, почему он делает что-то странное?» Ну, потому что у него есть ошибка. Исправьте ошибку, и тайна исчезнет. –
«Я сделал плохо. Я знаю, что я сделал плохо. В результате произошли плохие вещи. Объяснить, почему'. Имеет downvote :( –