Вы не можете вычислить размер массива, когда у вас есть только указатель.
Единственный способ сделать это "подобным функции" - это определить макрос:
#define ARRAY_SIZE( array ) ( sizeof( array ) / sizeof( array[0] ) )
Это, конечно, со всеми обычными оговорками макросов.
Редактировать: (комментарии ниже действительно относятся к ответу ...)
- Вы не можете определить количество элементов , инициализированных в массиве, если только вы сначала не инициализируете все элементы с «недопустимым» значением и не выполните подсчет «допустимых» значений вручную. Если ваш массив определен как имеющий 8 элементов, то для компилятора он имеет 8 элементов, независимо от того, инициализированы ли вы только 5 из них.
- Вы не можете определить размер массива внутри функции, которой этот массив был передан в качестве параметра. Не напрямую, не через макрос, ни в коем случае. Вы можете только определить размер массива в области, которая была объявлена в .
Невозможность определения размера массива в вызываемой функции может быть понята, когда вы поймете, что sizeof()
является оператором времени компиляции . Он может выглядеть как вызов функции времени выполнения, но это не так: компилятор определяет размер операндов и вставляет их как константы.
В области действия объявлен массив, у компилятора есть информация о том, что он на самом деле является массивом, и сколько у него элементов.
В функции, в которую передается массив, компилятор видит только указатель. (Учтите, что функция может вызываться со многими различными массивами, и помните, что sizeof()
является оператором времени компиляции .
Вы можете переключиться на C ++ и использовать <vector>
. Вы можете определить struct vector
плюс функции, обрабатывающие это, но это не совсем удобно:
#include <stdlib.h>
typedef struct
{
int * _data;
size_t _size;
} int_vector;
int_vector * create_int_vector( size_t size )
{
int_vector * _vec = malloc( sizeof( int_vector ) );
if ( _vec != NULL )
{
_vec._size = size;
_vec._data = (int *)malloc( size * sizeof( int ) );
}
return _vec;
}
void destroy_int_vector( int_vector * _vec )
{
free( _vec->_data );
free( _vec );
}
int main()
{
int_vector * myVector = create_int_vector( 8 );
if ( myVector != NULL && myVector->_data != NULL )
{
myVector->_data[0] = ...;
destroy_int_vector( myVector );
}
else if ( myVector != NULL )
{
free( myVector );
}
return 0;
}
Итог: массивы C ограничены. Вы не можете рассчитать их длину в подфункции, точка. Вы должны обойти это ограничение или использовать другой язык (например, C ++).