Intereting Posts
Безопасно ли делиться изменчивой переменной между основной программой и ISR в C? Представление 2D-массива в виде массива 1D C: Вставить / получить элемент в / из массива void Преобразование IEEE 754 Float в MIL-STD-1750A Float C: переходные (двойные) задания Запуск wc с помощью execvp () распознает /home/usr/foo.txt, но не ~ / foo.txt x86 Сборка: флаг INC и DEC и флаг переполнения Ошибка «Нет такого файла или каталога» в CodeBlocks Пустой или «флеш» дескриптор файла без чтения ()? печать utf8 в glib Необходимо знать, когда между двумя разделителями токенов нет данных, используя strtok () Чтение файла с использованием fscanf () в C Может ли код, который никогда не будет выполнен, вызывает неопределенное поведение? Каков предел для параметра malloc типа size_t в C? Документы говорят, что он имеет верхний предел UINT_MAX, но я не могу выйти за пределы INT_MAX C free () и инкрементные указатели массива

Является ли этот код действительным при любом стандарте C?

Этот код соответствует стандартам C (например, C89, C99, C10x)?

void main(int a,int b, int c, int d,char *msg){ if(d==1){ printf("%s\n",msg); }else{ main(1,2,3,1,&"Hello Stackoverflow"); } } 

Если нет, то почему?

Есть одна ошибка: &"Hello Stackoverflow" не имеет типа char* , поэтому вы не должны передавать это функции, ожидающей этого типа.

Кроме того, эта программа разрешена Стандартом как расширение для реализации, но компилятор имеет право отказаться от него.

Функция, вызванная при запуске программы, называется main . Реализация не объявляет прототипа для этой функции. Он должен быть определен с типом возврата int и без параметров:

 int main(void) { /* ... */ } 

или с двумя параметрами (называемыми здесь argc и argv , хотя любые имена могут использоваться, поскольку они являются локальными для функции, в которой они объявлены):

 int main(int argc, char *argv[]) { /* ... */ } 

или эквивалент; или каким-либо другим способом реализации .

(Стандарт 2011 года, последний проект раздела 5.1.2.2.1, выделено выделение).

В стандарте C нет запрета на рекурсивные призывы к main . Это отличие от C ++, что делает это вне закона.

Вы имеете в виду, что рядом с ним не будет работать? main определяется как принять int, char** качестве аргументов.

В зависимости от компилятора это либо не будет запущено, так как время выполнения не может найти main(int, char**) , или на старых компиляторах он просто сбой, потому что он заносит в стек стек.

Он действителен только в C99 и более поздних версиях, если реализация явно документирует, что main может принимать 5 параметров (4 int и 1 char * ) и возвращать void (это предложение «или каким-либо другим способом реализации», которое larsmans ссылается в его теперь – un-deleted answer, и я не думаю, что это предложение присутствовало на C89).

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