В целом при работе с C или низкоуровневым C ++ вы можете подумать о переобучении своего мозга, чтобы никогда не рассматривать запись параметров массива в функцию, потому что компилятор C всегда будет обращаться с ними как с указателями. По сути, вводя эти квадратные скобки, вы обманываете себя, полагая, что передается реальный массив с информацией о размере. На самом деле, в C вы можете передавать только указатели. Функция
void foo(char a[])
{
// Do something...
}
является, с точки зрения компилятора C, в точности эквивалентным:
void foo(char * a)
{
// Do something
}
и, очевидно, указатель на символ nekkid не содержит информации о длине.
Если вы застряли в углу и не можете изменить сигнатуру функции, рассмотрите возможность использования префикса длины, как предложено выше. Непереносимым, но совместимым хаком является указание длины массива в поле size_t, расположенном перед массива, что-то вроде этого:
void foo(char * a)
{
int cplusplus_len = reinterpret_cast<std::size_t *>(a)[-1];
int c_len = ((size_t *)a)[-1];
}
Очевидно, что ваш вызывающий должен создать массивы соответствующим образом, прежде чем передавать их в foo.
Само собой разумеется, что это ужасный взлом, но этот трюк может выйти из неприятностей в крайнем случае.