Есть ли безопасный способ получить длину массива указателей функций?длина массива указателей функций
Будет ли следующая работа?
sizeof((uintptr_t)(*fp)/sizeof(uintptr_t)(*fp[0]))
Есть ли безопасный способ получить длину массива указателей функций?длина массива указателей функций
Будет ли следующая работа?
sizeof((uintptr_t)(*fp)/sizeof(uintptr_t)(*fp[0]))
Независимо от типа элемента, стандартная идиома для длины массива:
#define countof(a) (sizeof(a)/sizeof(*(a)))
Это будет работать только тогда, когда a
является фактическим массивом, т.е. объявлен как TYPE a[...]
. Если a
является указателем на TYPE
, который был создан из массива, например, передав массив функции, указанный выше макрос приведет к некорректному результату.
Я подозреваю, что ваш код является результатом такого замешательства. Это dereferences fp
, что верно только в том случае, если fp
является указателем на массив, а не если он является указателем на элемент массива.
Не динамически выделяемый массив, а не указатель на массив (который по определению исключает динамически распределенные массивы).
sizeof(apointer)
вернет размер указателя, а не размер буфера, на который указывает. В C нет возможности для sizeof
знать, что указатель указывает на массив или только один элемент (который действительно является массивом из 1).
Если вы сделаете sizeof(*apointer)
, он вернет размер одного элемента (или первого элемента в массиве), потому что опять-таки нет возможности в C для sizeof знать, что указатель указывает на массив или только один элемент.
Почему вы бросаете? – cnicutar
По крайней мере, это не сработает, как вы намереваетесь. Следите за своими круглыми скобками. И, пожалуйста, покажите декларацию 'fp'. – moooeeeep