2013-02-11 2 views
1

Я пытаюсь найти длину массива структур «заголовка», которые я определил (заголовок содержит только несколько информационных членов int, если это имеет значение здесь). Я пытаюсь это сделать, передав fl, указатель на начало массива и idx, значение индекса, указывающее, где находится указатель fl_tails, расположенный в конце массива (в других/повторяющихся словах, 'fl_tails [idx ] `является указатель конца):Поиск длины массива в C

int arr_size(header* fl, int idx){ 

    int cnt = 1; /* Anything passed guaranteed to have at least 1 */ 

    while(fl != fl_tails[idx]){ 
    fl++; 
    cnt++; 
    } 
} 

Я думал, что это будет просто продвигать fl указатель и произвести подсчет должным образом до тех пор, пока не будет достигнут к концу, но он переходит в бесконечный цикл. Мне интересно, вызвано ли это чем-то в этой функции или просто чем-то в другом месте, которое мне нужно найти. Когда я печатал адреса начала и конца как unsigned ints, они казались достаточно безвредными - такие вещи, как 16777216 и 16777344, соответственно. Может быть, что-то не так с моим пониманием структуры header и ее размером/эффектом на шагах?

+0

Если у вас уже есть индекс для последнего элемента массива. Длина массива - просто 'index + 1', зачем вам снова проходить через массив? –

+0

Это другой тип индекса из отдельного массива. – nicole

+0

Для C проблематично найти размер простого старого массива C после его деградации в указатель (т. Е. Вы передали его функции). Обычно вы отслеживаете количество элементов для массива или общий размер массива и передаете это в любую функцию, которая управляет массивом. –

ответ

1

Вы хотите сравнить адреса, так:

while(fl != &fl_tails[idx]) 
      ^
+0

fl_tails [idx] сам по себе является указателем (в основном, адресом, когда считается значением, не так ли?). Когда я это пробовал, я сначала получил предупреждение: для сравнения различных типов указателей не хватает роли [включен по умолчанию], которая ушла, когда я передал fl_tails [idx] указателю заголовка (которого он уже достаточно, как ни странно). Но все же это дает мне огромное и неправильное количество. – nicole

+0

Так что fl_tails не относится к типу 'header *'? Для этого для работы 'fl' должен прибыть в & fl_tails [idx]. Однако, даже если это сработало, оно очень хрупко, поскольку нет ничего, гарантирующего, что разумная связь между fl и fl_tails передается в эту функцию. – PQuinn

+0

@nicole, напишите больше кода о том, что означает 'fl_tails' и' fl', их объявление и т. Д. –

1

Я смотрю на ваше время цикла, вы сравниваете адрес памяти от значения в индексе. Это всегда будет считаться истинным. Я считаю, что именно поэтому вы получаете бесконечный цикл.

Что касается длины массива, рассмотрели ли вы использование оператора/функции sizeof().

+0

sizeof() не будет работать, когда массив передается функции –

+0

sizeof (указатель на массив) 'fl' - 4 байта только! –

+0

Но если «значение» в индексе является указателем, не является ли он еще адресом? 'fl_tails' объявляется как' header ** fl_tails' – nicole

0

Проблема fl_tails[idx] возвращает другой тип указателя, а fl имеет другой тип указателя. Они никогда не укажут на одно и то же место (если они не находятся внутри союза), и поэтому, я думаю, программа переходит в бесконечный цикл.

0

Помните, что:

while(fl != fl_tails[idx]) 

эквивалентно:

while(fl != *(fl_tails + idx)) 

так, что вы делаете, сравнивая указатель фл до фактического значения, так как (fl_tails + IDX) является указателем и * (fl_tails + idx) разыменовывает этот указатель, чтобы получить значение, на которое оно указывает.

так что если вы просто сравнивая указатель адреса, чтобы найти конец массива, я хотел бы изменить, чтобы:

while(fl != &fl_tails[idx]) 

так, что вы сравниваете указатели на указатели.

Что касается полученных вами значений, помните, что указатель без указателя может иметь указатель с инициализированным значением (некоторое старое значение из какой-либо старой программы). Я рекомендую посмотреть это видео:

http://www.youtube.com/watch?v=f-pJlnpkLp0

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