Я думаю, что вы путаетесь между строками C (массивы char
) и другими массивами. Это соглашение о том, что строки C заканчиваются нулевым символом ('\0'
), но не все массивы (даже char
массивы) заканчиваются таким образом.
Общее соглашение состоит в том, чтобы либо хранить длину массива где-то, либо использовать значение сторожевой части в конце массива. Это значение должно быть таким, которое не будет отображаться внутри массива - например, '\0'
в строках, или -1
в массиве положительных целых чисел.
Кроме того, если вы знаете, что a
является целочисленный массив (а не указатель на целочисленный массив), то вы можете использовать:
size_t length = sizeof(a)/sizeof(a[0]);
Так что вы можете сделать:
int a[] = {1,2,3,4,5,6,7,8};
size_t length = sizeof(a)/sizeof(a[0]);
// In this case, sizeof(a[0])
// is the same as sizeof(int), because it's an int array.
Но вы не можете сделать:
int *a = malloc(sizeof(int) * 10);
size_t length = sizeof(a)/sizeof(a[0]); // WRONG!
Этот последний пример будет скомпилирован, но ответ будет неправильным, re получая размер указателя на массив, а не размер массива.
Обратите внимание, что вы также не можете использовать это sizeof
, чтобы прочитать размер массива, который был передан в функцию. Не имеет значения, будете ли вы объявлять свою функцию len(int *a)
или - a
будет указателем, потому что компилятор преобразует массивы в аргументы функции в указатель на их первый элемент.
Да. То, что вы пытаетесь сделать, по своей сути ошибочно. Вы не можете считать длины массивов в C. Если у вас есть _actual array_, вы можете использовать '#define ARRLEN (arr) (sizeof (arr)/sizeof (* arr))', но он не будет работать с указателями и поэтому на массивы передаются функции. –