2013-03-13 3 views
0

Есть ли безопасный способ получить длину массива указателей функций?длина массива указателей функций

Будет ли следующая работа?

sizeof((uintptr_t)(*fp)/sizeof(uintptr_t)(*fp[0])) 
+0

Почему вы бросаете? – cnicutar

+0

По крайней мере, это не сработает, как вы намереваетесь. Следите за своими круглыми скобками. И, пожалуйста, покажите декларацию 'fp'. – moooeeeep

ответ

2

Независимо от типа элемента, стандартная идиома для длины массива:

#define countof(a) (sizeof(a)/sizeof(*(a))) 

Это будет работать только тогда, когда a является фактическим массивом, т.е. объявлен как TYPE a[...]. Если a является указателем на TYPE, который был создан из массива, например, передав массив функции, указанный выше макрос приведет к некорректному результату.

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

1

Не динамически выделяемый массив, а не указатель на массив (который по определению исключает динамически распределенные массивы).

sizeof(apointer) вернет размер указателя, а не размер буфера, на который указывает. В C нет возможности для sizeof знать, что указатель указывает на массив или только один элемент (который действительно является массивом из 1).

Если вы сделаете sizeof(*apointer), он вернет размер одного элемента (или первого элемента в массиве), потому что опять-таки нет возможности в C для sizeof знать, что указатель указывает на массив или только один элемент.

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