Почему C-массив имеет несправедливость sizeof () значение, когда это передается функции? [дубликат]

Этот вопрос уже имеет ответ здесь:

Полный пример:

#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 дает мне правильное значение. Выполнение той же самой вещи на том же самом массиве в функции дает странные результаты. Существует одно отсутствие элемента. Почему?

33
задан jww 2 March 2017 в 05:50
поделиться

5 ответов

Когда вы передаете массив в функцию в 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]) не работает для динамически выделенного массива, только для массива, выделенного на стеке.

44
ответ дан 27 November 2019 в 18:03
поделиться

Потому что, когда он передается, фактически передается только указатель на массив.

Ответ на ваш вопрос также можно найти на The C Programming FAQ . Вопрос 6.21.

3
ответ дан 27 November 2019 в 18:03
поделиться

Потому что массив распадается на указатель, когда передается как аргумент функции, поэтому sizeof дает вам 4 и 8 для 32- и 64-битных платформ соответственно.

14
ответ дан 27 November 2019 в 18:03
поделиться

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

6
ответ дан 27 November 2019 в 18:03
поделиться

Потому что sizeof() НЕ говорит вам размер массива в C. Она делает что-то совершенно другое.

sizeof C++ reference

0
ответ дан 27 November 2019 в 18:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: