2013-05-27 3 views
0

когда я проектирование функции С, что нужно взять переменную массив длины, как сделать выбор между:передать массив переменной длины функции, следует ли использовать параметр длины массива или маркер конца массива?

  1. добавить еще один параметр, чтобы дать длину массива? и
  2. завершение массива специальным маркером (например, '\ 0')?
  3. какой-нибудь другой опция? что?

E.g.

void myfunc(int arr[], int arr_length) { ... } 
... 
int arr[3] = { 1, 2, 3 }; 
myfunc(myarr, 3); 

или

void myfunc(int arr[]) { ... } 
... 
int arr[4] = { 1, 2, 3, '\0' }; 
myfunc(arr); 
+1

Я предпочитаю первый, так что вы не получите доступ за пределы. – Bill

+2

Прохождение длины работает всегда. Некоторое время спустя часовое является законным значением. –

+1

Вы знаете, что '' \ 0'' совпадает с '0', верно? – jamesdlin

ответ

1

Соглашение заключается в передаче длины массива, если только массив не является массивом символов (т. Е. Строка); в этом случае C автоматически завершает нуль строки с 0x00.

Вы можете использовать нулевой ограничитель по вашему выбору для завершения работы массива. Например, если у вас есть массив подписанных int, но каким-то образом вы знаете, что ни один из них не будет отрицательным, вы можете использовать -1 (или любое отрицательное число). Проблема с использованием нуль-терминаторов заключается в том, что вы теряете некоторые возможные значения. Возьмем, к примеру, тип данных длиной 4 бита. Если я определяю 0b1111 в качестве терминатора, то максимальное значение, которое я могу разместить в моем массиве этого типа, равно 0b1110. Строки причины имеют нулевое завершение, так как в ASCII число чисел от 0 до 255 больше, чем символов, которые мы хотели выразить, поэтому использование нулевого терминатора ничего не стоит.

Если вы передаете длину массива и перебираете все значения в массиве, вы автоматически должны использовать максимальное значение в цикле for. Кроме того, в C вы почти всегда знаете длину своего массива при его создании.

EDIT: И что касается передачи маркера конца массива, это не должно быть проблемой для программ, которые вы запускаете на вашем компьютере, но я бы пересмотрел их, поскольку различные аппаратные реализации имеют разные типы данных. Если на вашем компьютере имеется массив из 4-х int (16 бит), ваш массив, начинающийся с 0x1000, закончится на 0x1008 (например) на вашем компьютере, но закончится на 0x1004 на моем.

0

Объявляет int arr_length как глобальную переменную. Тогда не нужно передавать его.

or

Передайте длину в качестве аргумента. Но никогда не используйте специальный символ в качестве конечного маркера. Если вы пройдете '\0', как int arr[4] = { 1, 2, 3, '\0' };. Затем arr[3] сохранит эквивалент ASCII '\0'() и который вполне может быть частью законного ввода.

+1

Что делать, если есть необходимость вызывать эту функцию несколько раз, и может быть какая-то другая функция должна одновременно обращаться к обеим массивам? – Bill

Смежные вопросы