Этот вопрос уже имеет ответ здесь:
Полный пример:
#include
void test(int arr[]) {
int arrSize = (int)(sizeof(arr) / sizeof(arr[0]));
printf("%d\n", arrSize); // 2 (wrong?!)
}
int main (int argc, const char * argv[]) {
int point[3] = {50, 30, 12};
int arrSize = (int)(sizeof(point) / sizeof(point[0]));
printf("%d\n", arrSize); // 3 (correct :-) )
test(point);
return 0;
}
Прежде, чем передать его функции, sizeof дает мне правильное значение. Выполнение той же самой вещи на том же самом массиве в функции дает странные результаты. Существует одно отсутствие элемента. Почему?
Когда вы передаете массив в функцию в C, массив распадается на указатель на его первый элемент. Когда вы используете sizeof
для параметра, вы берете размер указателя, а не самого массива.
Если вам нужно, чтобы функция знала размер массива, вы должны передать его как отдельный параметр:
void test(int arr[], size_t elems) {
/* ... */
}
int main(int argc, const char * argv[]) {
int point[3] = {50, 30, 12};
/* ... */
test(point, sizeof(point)/sizeof(point[0]));
/* ... */
}
Также обратите внимание, что по аналогичной причине (взятие sizeof
указателя) трюк sizeof(point)/sizeof(point[0])
не работает для динамически выделенного массива, только для массива, выделенного на стеке.
Потому что, когда он передается, фактически передается только указатель на массив.
Ответ на ваш вопрос также можно найти на The C Programming FAQ . Вопрос 6.21.
Потому что массив распадается на указатель, когда передается как аргумент функции, поэтому sizeof
дает вам 4 и 8 для 32- и 64-битных платформ соответственно.
Также важно понимать, что sizeof
оценивается во время компиляции. Поскольку это так, не имеет смысла ожидать разного результата в test()
в зависимости от того, что было передано. Вычисление sizeof
было выполнено при компиляции функции.
Потому что sizeof() НЕ говорит вам размер массива в C. Она делает что-то совершенно другое.