Поведение размера в C

Я узнал, что когда мы передаем имя массива в sizeof, имя массива не распадается на указатель на базовый адрес. Приведенный ниже код проверяет этот факт, давая ответ 10.

#include  int main(){ int arr[10]; printf("Size of array is %d" , sizeof(arr)/sizeof(int)); return 0; } 

Однако, когда я запускаю код ниже, ответ приходит 1. Независимо от того, написано ли измерение в прототипе или нет, ответ: 1. Почему это так?

 #include  void dimension(int arr[]){ printf("Sizof array is %d" , sizeof(arr)/sizeof(int)); } int main(){ int arr[10]; dimension(arr); return 0; } 

Эта подпись

 void dimension(int arr[]) 

абсолютно эквивалентна

 void dimension(int *arr) 

См. Также вопрос 6.4

Потому что вы передаете массив неизвестного размера, который эквивалентен указателю в этом контексте. sizeof рассчитывается во время компиляции , а не во время выполнения.

Когда массив передается функции, он передается как указатель, а не массив, поэтому sizeof(arr) возвращает sizeof(int *)

Однако массивы как аргументы функции распадаются на указатель. Поскольку это происходит до вызова sizeof (), вы не можете его предотвратить.

Подумайте об этом: как sizeof () знает размер массива, если любой массив размера может быть передан, и дополнительная информация недоступна? Вы получаете sizeof (указатель), и это похоже на тот же размер, что и int, в вашей настройке.

В

 void dimension(int arr[]){ printf("Sizof array is %d" , sizeof(arr)/sizeof(int)); } 

arr[] распадается на указатель, поэтому у вас есть эквивалент

 printf("Sizof array is %d" , sizeof(int*)/sizeof(int)); 

и поскольку на вашей платформе sizeof(int*) == sizeof(int) , вы получаете результат 1.

Однако обратите внимание, что для массивов переменной длины sizeof становится операцией времени выполнения:

 int main () { int i = ...; int x[i]; printf("number of elements: %d", sizeof (x) / size(*x)); } 

потому что arr является указателем, который является целым числом.

Он возвращает размер указателя, который является целым числом.

Потому что вы передаете неизвестный размер массива.