Нет, это все равно приведет к правильному значению, потому что вы должны определить массив как все элементы одного типа или указатели на тип.В любом случае размер массива известен во время компиляции, поэтому sizeof (arr) / sizeof (arr [0]) всегда возвращает количество элементов.
Вот пример того, как правильно использовать это:
int nonDynamicArray[ 4 ];
#define nonDynamicArrayElementCount ( sizeof(nonDynamicArray) / sizeof(nonDynamicArray[ 0 ]) )
Я пойду сюда еще раз, чтобы показать , когда , чтобы использовать это правильно.Вы не будете использовать это очень часто.Это в первую очередь полезно, когда вы хотите определить массив, чтобы вы могли добавлять в него элементы, не меняя при этом много кода.Это конструкция, которая в первую очередь полезна для обслуживания .Канонический пример (когда я все равно об этом думаю ;-) - это создание таблицы команд для некоторой программы, в которую вы намереваетесь добавить больше команд позже.В этом примере для поддержки / улучшения вашей программы все, что вам нужно сделать, это добавить еще одну команду в массив, а затем добавить ее обработчик:
char *commands[] = { // <--- note intentional lack of explicit array size
"open",
"close",
"abort",
"crash"
};
#define kCommandsCount ( sizeof(commands) / sizeof(commands[ 0 ]) )
void processCommand( char *command ) {
int i;
for ( i = 0; i < kCommandsCount; ++i ) {
// if command == commands[ i ] do something (be sure to compare full string)
}
}