Может быть сторонняя DLL предполагает, что массивы представлены таким образом, причем первый элемент содержит длину? Это имело бы смысл, если бы массивы также основывались на 1 и проверялись на границы.
Трудно быть более конкретным, когда вы не даете больше информации о коде.
Более классический макрос для вычисления длины массива:
#define ARRAY_SIZE(x) ((sizeof x) / (sizeof *x))
Обратите внимание, что это работает только для реальных массивов, где объявление массива находится в области видимости. Это, в частности, не работает в C:
size_t array_length(const int *data)
{
/* Note: this is a negative example: IT DOES NOT WORK. */
return ARRAY_SIZE(data);
}
int main(void)
{
int test[4711];
printf("the test[] array is %zu elements long\n", array_length(test));
return 0;
}
Выше не будет печатать 4711
; размер массива не является частью типа const int *
, в который массив затухает при вызове функции. Как правило, это не возможно сделать в C, то есть найти размер массива, который был передан функции, принимающей указатель.