Как sizeof вычисляет размер массива?

int arr[SIZE] = { 1, 2, 3, 4, 5 };

printf("%zd\n", sizeof(*(arr + 0))); // 4
printf("%zd", sizeof(arr)); // 20


Как sizeof вычисляет размер массива, если передавая функции имя массива, по факту передается указатель на первый элемент, в данном случае sizeof получает указатель на int (sizeof (int) == 4). Откуда функция узнает количество элементов? По идеи при передаче sizeof указателя, должен возвращаться размер этого указателя (в моем случае 8).
sizeof(&arr[0]) == 8.
Как это все работает если // &arr[0] == arr
Выводят один и тот же адрес:
printf("%p\n", &arr[0]);
printf("%p\n", arr);

А вот если вызывать sizeof с этими значениями то будет разные результаты.
printf("%zd\n", sizeof(&arr[0])); // Выводится размер указателя
printf("%zd\n", sizeof(arr)); // Выводится размер всего массива, хотя и то и то являются адресами первого элемента
  • Вопрос задан
  • 10002 просмотра
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
sizeof - это не функция (хоть и выглядит похоже) - это операция взятия размера.
sizeof всегда вычисляется на этапе компиляции, т.е. в исполняемом файле вместо вызова sizeof уже будет вычисленная константа.
Когда компилятор знает размер массива, как в вашем примере, он вернет полный размер массива.
Но если передать в sizeof произвольный указатель (именно указатель, а не статический массив), он вернет размер указателя.

Статический массив - это не указатель. Указатель - на этапе выполнения занимает в памяти место для хранения адреса. Статический массив занимает в памяти место для хранения данных массива.
Поэтому статический массив - это не указатель. Хотя часто компилятор работает с именем статического массива как с указателем.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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