Есть ли более короткий способ найти длину массива, чем этот код C? - PullRequest
3 голосов
/ 10 февраля 2012
static int a[] = {1, 5, 645, 43, 4, 65, 5408, 4, 7, 90, 23, 11};
int len=sizeof(a)/sizeof(int);

Есть ли ярлык с ANSI 99?

Ответы [ 3 ]

5 голосов
/ 10 февраля 2012

Я думаю, что ярлыка нет, но вы используете макрос:

#define arrlen(arr) (sizeof(arr)/sizeof(arr[0]))
1 голос
/ 10 февраля 2012

Если вы хотите, чтобы количество элементов в массиве,

sizeof arr / sizeof *arr

или

sizeof arr / sizeof arr[0]

было бы как можно меньше.Просто помните, что если arr не является VLA, они будут вычислены во время компиляции.

Также помните, что это работает, только если arr является выражением array , а не указателем.Если вы сделаете что-то вроде

void foo(int arr[])
{
   size_t len = sizeof arr / sizeof *arr;
   ...
}

, вы не получите ожидаемого ответа, потому что в этом контексте arr является указателем выражением, а не массивом (см. Онлайн Стандарт языка C , § 6.3.2.1 and 3 и § 6.5.7.3 ¶ 7).

1 голос
/ 10 февраля 2012

Есть ли более короткий способ найти длину массива, чем этот код C?

Да, на один символ короче:

static int a[] = {1, 5, 645, 43, 4, 65, 5408, 4, 7, 90, 23, 11};
int len=sizeof a/sizeof(int);

edit: Есть еще более короткая версия, предложенная @pmg:

static int a[] = {1, 5, 645, 43, 4, 65, 5408, 4, 7, 90, 23, 11};
int len=sizeof a/sizeof*a;

Вы также можете использовать меньше символов для идентификатора len.

:)

...