интервьюер явно должен получить новый тестовый материал :) Это…
main()
{
int a[50];
&a;
}
… является старым K & R C. Если не объявлено иначе, функция возвращает int
, и последний оператор функции возвращается неявно. Вы можете переписать это в ANSI C следующим образом:
int main()
{
int a[50];
return &a;
}
Итак, давайте рассмотрим эту программу:
int main()
Определить функцию main
, возвращающую int
, принимающую произвольные параметры.
{
int a[50];
Определите массив из 50 int
в автоматическом хранилище и присвойте указатель int
(int*
) на первый элемент этого массива переменной литерала a
.
return (intptr_t)&a;
}
Теперь это немного сложно. Просто запись a
приводит к адресу первого элемента массива . Оператор &
принимает адрес переменной , в которой хранится этот конкретный указатель. Неважно, что где-то выделено 50 int
, и эта переменная в данный момент указывает на него. Мы берем указатель на указатель, то есть указатель int
(int**
). массив, снова его первый элемент.
Однако K & R C определяет неявное преобразование типов указателей в целые числа. Значение этого указателя однозначно идентифицирует исходный указатель и должно соответствовать арифметике указателя. Большинство компиляторов реализуют это, просто сохраняя дословный адрес указателя в целом числе. Важное исключение: любое специальное машинно-зависимое значение nil-указателя должно отображаться в 0 на стороне C, а int
или intptr_t
из 0 приведения к указателю должно соответствовать значению nil архитектуры (на большинстве архитектур значение nil компьютера равно 0 тоже).
main
возвращает целочисленное представление указателя, в большинстве систем адрес его памяти, который по определению стандарта C обозначает его код выхода.
Компиляция этой программы
cc -o interview_question interview_question.c
Вы можете выполнить и отобразить код выхода, используя
./interview_question ; echo $?
Это будет произвольное, но не случайное число.
РЕДАКТИРОВАТЬ в связи с комментариями и исправлениями @John Bodes.