Не зацикливайтесь на том факте, что ему передают адрес.strlen()
всегда принимает адрес.Это аргумент const char *
, адрес строки.Все эти вызовы проходят по одному и тому же адресу:
strlen(baz);
strlen(&bar[0]);
strlen(bar);
baz
назначается &bar[0]
, поэтому первый и второй эквивалентны. Массив распадается на указатель на свой первый элемент (array == &array[0]
), поэтому второй и третий эквивалентны.
Я имею в виду, как мы можем найти длину адреса , который является просто числом?
Допустим, что bar == &bar[0] == baz == (char *) 0xb96eb740
согласно вашемупример.strlen()
сначала проверит, содержит ли ячейка памяти 0xb96eb740 \0
.Если нет, то он проверит 0xb96eb741.Тогда 0xb96eb742.Тогда 0xb96eb743.Он будет продолжать проверять каждое местоположение последовательно, пока не найдет \0
.
Я знаю, что это правда.Но почему strlen(baz)
возвращает 0?
Как объясняет связанный вопрос и ответ, поведение не определено , поскольку содержимое массива bar[128]
неинициализировано.В этом массиве может быть что угодно.Единственная известная нам ячейка - это bar[127]
, которая установлена в \0
.Все остальные неинициализированы.
Это означает, что любой из них, или все, или ни один из них, может содержать символ \0
.Это может измениться от бега к бегу, от звонка к звонку даже.Каждый раз, когда вы звоните foo()
, вы можете получить другой результат.Это вполне возможно.Результат будет зависеть от того, какие данные находятся в стеке до вызова foo()
.
Когда я запускаю этот код, каждый раз выдается 0
, а правильные ответы 0
и 127
(я до сих пор не понимаю, почему?).
Может возвращать любое значение в диапазоне от 0 до 127. Из-за неопределенного поведения вы не должны слишком много читать в том, чтопрограмма происходит , чтобы вернуться, когда вы запустите его.Вывод может быть другим, если вы снова запустите программу, если вы вызовете другой набор функций до foo()
, если вы запустите другую программу заранее, если вы измените компиляторы, если вы запустите ее в другой день недели, есливы используете другую операционную систему и т. д. и т. д. и т. п.