В соответствии с ISO C int* main(void)
не является одной из форм функции запуска main
, которая необходима для поддержки. Таким образом, поведение не определяется стандартом языка.
int *main(void)
может работать как документированное расширение, обеспечиваемое вашей реализацией C. Таким образом, реализации C могут поддерживать дополнительные способы записи функции запуска.
Скорее всего, конструкция ошибочна, и ваша реализация просто игнорирует ситуацию; он просто компилирует код и позволяет машинным инструкциям делать то, что они могут. Чтобы понять реальное поведение, вы должны понимать, что происходит на этом уровне.
Вполне возможно, побитовое представление возвращаемого самого указателя интерпретируются как значение состояния завершения целого числа, которое переводит к операционной системе коду выхода 56. (возможно, некоторым битовому поле в значении, такие как самые низкие 8 бит, составляет 56).Это предполагает, что int *
и int
возвращаются из функции таким же образом. Они могут и не быть. Например, в компиляторах C для процессоров серии Motorola 68000 существует соглашение о возврате указателя через регистр A0 и целочисленное значение в D0. Поэтому, если функция возврата int *
записывается, чтобы удовлетворить внешнюю ссылку на то, что, как ожидается, будет возвращено int
, вызывающий абонент получает любой мусор, находящийся в D0, тогда как указатель переместился в A0.
Поскольку поведение не определено, нет необходимости в диагностике! На языке C вы можете даже написать это:
int main[42] = { 3 };
В некоторых средах, которые будут скомпилированы и ссылки. При выполнении данные массива заканчиваются использованием изображения функции машинного языка. Программа, основанная на этом трюке один раз (возможно, более одного раза), появилась на Международном конкурсе «Обфускация C» IOCC.
56 ничего не значит; программа недействительна. –
@JohnZwinck Я так не думаю. Если это была ошибка, то почему она не изменится и стек на 56? Также моя проблема заключается в том, чтобы вернуть правильную вещь в главном (все знают 0 правильно). –
Ваша программа недействительна. 56 - не полезное число, это всего лишь случайное дерьмо, в котором вы оказались из-за некоторой причуды вашей платформы. Допустимый тип - int. Если вы включите предупреждения компилятора как ошибки, вы можете обнаружить, что ваш код в письменном виде даже не будет компилироваться. Например, мой компилятор говорит 'error: return type of 'main' is not 'int'' –