Есть ли ярлык для размера / длины массива в C? - PullRequest
6 голосов
/ 29 ноября 2010

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

Набирать sizeof(array)/sizeof(int) каждый раз, когда стареет.Есть ли в каких-нибудь библиотеках C что-то вроде .length или есть какой-то способ, которым я могу определить sizeof(array)/sizeof(int) как более короткую константу какого-то рода (возможно, также с использованием точечной нотации)?

Ответы [ 4 ]

11 голосов
/ 29 ноября 2010

Вы можете использовать sizeof(array)/sizeof(*array) и сделать макрос.

#define length(array) (sizeof(array)/sizeof(*(array)))
11 голосов
/ 29 ноября 2010

Все решения в C сводятся к макросу:

#define ARRAY_LENGTH(array) (sizeof((array))/sizeof((array)[0]))
3 голосов
/ 29 ноября 2010

Вы всегда можете написать макрос для этого.Обратите внимание, что он не будет работать как функция, так как вам придется понизить массив до указателя на его первый элемент, поэтому он просто вернет sizeof(int *) / sizeof(int).

#define INTSIZE(array) (sizeof(array) / (sizeof(int))

Или большев общем ...

#define SIZE(array, type) (sizeof(array) / (sizeof(type))

Ничего себе, отрицательных голосов.Хорошо, это также будет работать:

#define SIZE(array) (sizeof(array) / (sizeof((array)[0]))
2 голосов
/ 30 ноября 2010

Краткий ответ «нет»; в C нет способа получить количество элементов в массиве на основании только одного выражения массива . Трюк sizeof почти так же хорош, как его можно получить, и его использование ограничено выражениями типа массива. Таким образом, следующее не будет работать:

char *foo = malloc(1024);
size_t count = sizeof foo; 

count получает количество байтов для типа указателя (4 в типичной архитектуре рабочего стола), а не в выделенном блоке.

char arr[100];
char *p = arr;
size_t count = sizeof p; 

То же, что и выше.

void foo(char *arr)
{
  size_t count = sizeof arr; // same as above
  ...
}

void bar(void)
{
  char array[100];
  foo(array);
  ... 
}

То же, что и выше.

Если вам нужно узнать, сколько элементов в массиве, вам нужно отслеживать эту информацию отдельно.

Обработка массивов

C является источником серии изжоги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...