Соглашение заключается в передаче длины массива, если только массив не является массивом символов (т. Е. Строка); в этом случае C автоматически завершает нуль строки с 0x00.
Вы можете использовать нулевой ограничитель по вашему выбору для завершения работы массива. Например, если у вас есть массив подписанных int, но каким-то образом вы знаете, что ни один из них не будет отрицательным, вы можете использовать -1 (или любое отрицательное число). Проблема с использованием нуль-терминаторов заключается в том, что вы теряете некоторые возможные значения. Возьмем, к примеру, тип данных длиной 4 бита. Если я определяю 0b1111 в качестве терминатора, то максимальное значение, которое я могу разместить в моем массиве этого типа, равно 0b1110. Строки причины имеют нулевое завершение, так как в ASCII число чисел от 0 до 255 больше, чем символов, которые мы хотели выразить, поэтому использование нулевого терминатора ничего не стоит.
Если вы передаете длину массива и перебираете все значения в массиве, вы автоматически должны использовать максимальное значение в цикле for. Кроме того, в C вы почти всегда знаете длину своего массива при его создании.
EDIT: И что касается передачи маркера конца массива, это не должно быть проблемой для программ, которые вы запускаете на вашем компьютере, но я бы пересмотрел их, поскольку различные аппаратные реализации имеют разные типы данных. Если на вашем компьютере имеется массив из 4-х int (16 бит), ваш массив, начинающийся с 0x1000, закончится на 0x1008 (например) на вашем компьютере, но закончится на 0x1004 на моем.
Я предпочитаю первый, так что вы не получите доступ за пределы. – Bill
Прохождение длины работает всегда. Некоторое время спустя часовое является законным значением. –
Вы знаете, что '' \ 0'' совпадает с '0', верно? – jamesdlin