Aufruf von main() in main() in c

Lesezeit: 5 Minuten

Benutzeravatar von anant
eine Ameise

Ist es möglich anzurufen main() innerhalb der main() Funktion in c?

  • Hast Du es versucht? Hat es funktioniert?

    – Donnie

    21. November 2010 um 13:53 Uhr

  • @Donnie nur weil etwas in einem Testbeispiel zu funktionieren scheint, heißt das nicht, dass es immer funktioniert oder richtig ist. “Probieren Sie es aus und sehen Sie, ob es funktioniert” ist in C oft gefährlich.

    – Nr

    21. November 2010 um 13:57 Uhr


  • @nos: Ich hätte immer noch gerne gesehen, dass sich der Autor darum gekümmert hat, es zumindest zuerst zu versuchen und seine Erfahrungen mitzuteilen, bevor er die Frage stellt. Ich habe keine Lust, dass Leute dies als interaktive Google-Oberfläche verwenden.

    – Sedat Kapanoglu

    21. November 2010 um 13:59 Uhr

  • Es ist eine legitime Frage, z. B. der C++-Standard verbietet sie ausdrücklich, während ein “versuchen und sehen, ob es funktioniert”-Ansatz wahrscheinlich zeigen würde, dass “es funktioniert”, wenn sich diese Frage auf C++ beziehen würde, aber es wäre nicht richtig.

    – Nr

    21. November 2010 um 14:01 Uhr


  • Wenn Sie Beispiele wollen main() Berufung main()hier sind viele: iocc.org Es ist die Website des International Obfuscated C Code Contest und faltet alles in eine einzige Funktion namens main ist eine effektive Verschleierungstechnik.

    – Cmaster – Wiedereinsetzung von Monica

    8. Dezember 2015 um 7:03 Uhr

Benutzeravatar von nos
Nr

Ja, C erlaubt Ihnen, Ihre Hauptfunktion aufzurufen (während C++ dies nicht tut)

  • Ich bin neugierig, warum können Sie es nicht in C++ aufrufen?

    – Meister der Diebe

    21. November 2010 um 13:54 Uhr

  • @ThiefMaster: Die einfachste Implementierung globaler Konstruktoren (ohne besondere Unterstützung durch das Betriebssystem und den zugrunde liegenden C-Laufzeit-Eingabecode) besteht darin, dass der C++-Compiler zu Beginn einen Funktionsaufruf generiert main (__main ist ein gebräuchlicher Name dafür), der alle globalen Konstruktoren aufruft. Globale Objekte müssen jedes Mal rekonstruiert werden main rekursiv aufgerufen wird, wäre eine eher schlechte Sache… 🙂

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    21. November 2010 um 14:04 Uhr

  • @nos Könnten Sie auf eine Stelle in einem C-Standard verweisen, die speziell angesprochen wird main() Rekursion, wenn sie speziell angesprochen wird?

    – rekursion.ninja

    17. August 2013 um 15:52 Uhr

  • Ich denke, du solltest das stattdessen verlinken.

    – Benutzer202729

    16. August 2018 um 11:08 Uhr

  • @ThiefMaster Einfach weil der Standard sagt, dass du es nicht kannst;)

    – klutt

    2. Februar um 15:09 Uhr

Benutzeravatar von paxdiablo
paxdiablo

Es ist tatsächlich erlaubt anzurufen main() von sich selbst, sogar das Vermeiden eines Stapelüberlaufs mit der gleichen Methode, die für jeden anderen rekursiven Code verwendet wird, eine Beendigungsbedingung wie mit:

#include <stdio.h>
int main (int argc, char *argv[]) {
    printf ("Running main with argc = %d, last="%s"\n",
        argc, argv[argc-1]);
    if (argc > 1)
        return main(argc - 1, argv);
    return 0;
}

die, wenn ausgeführt als testprog 1 2 3Ausgänge:

Running main with argc = 4, last="3"
Running main with argc = 3, last="2"
Running main with argc = 2, last="1"
Running main with argc = 1, last="testprog"

Da das aber nur anekdotisch Beweise, sollten wir uns an den Standard wenden. Abschnitt ISO C11 4 Conformance Zustände:

1/ In dieser Internationalen Norm ist „soll“ als Anforderung an eine Implementierung oder an ein Programm auszulegen; umgekehrt ist „darf nicht“ als Verbot zu interpretieren.

2/ Wenn eine „soll“- oder „soll nicht“-Anforderung, die außerhalb einer Beschränkung oder einer Laufzeitbeschränkung erscheint, verletzt wird, ist das Verhalten undefiniert. Nicht definiertes Verhalten wird in dieser Internationalen Norm ansonsten durch die Worte „nicht definiertes Verhalten“ oder durch Weglassen einer expliziten Definition von Verhalten angegeben. Zwischen diesen dreien gibt es keinen Unterschied in der Betonung; sie alle beschreiben „undefiniertes Verhalten“.

3/ Ein Programm, das in allen anderen Aspekten korrekt ist, mit korrekten Daten arbeitet und unspezifisches Verhalten enthält, muss ein korrektes Programm sein und in Übereinstimmung mit 5.1.2.3 handeln.

Nun, da gibt es keine explizite Verbot irgendwo im Standard auf main() sich selbst aufrufend, ist obiger Absatz 3 der kontrollierende Aspekt.

Weitere Unterstützung ist an zwei Stellen (mein Fettdruck) zu sehen, zuerst im Abschnitt 5.1.2.2.3 Program termination:

1/ Wenn der Rückgabetyp der main Funktion ist ein Typ, der mit kompatibel ist inteine Rückkehr von der Initial Anruf bei der main Funktion entspricht dem Aufruf der exit Funktion mit dem von der zurückgegebenen Wert main Funktion als Argument;

Und dann im Schnitt 7.21.3 Files:

5/ Die Datei kann anschließend durch dieselbe oder eine andere Programmausführung erneut geöffnet und ihr Inhalt zurückgefordert oder geändert werden (wenn sie am Anfang neu positioniert werden kann). Wenn die main Funktion kehrt zu seiner zurück Original Anrufer, oder wenn der exit Funktion aufgerufen wird, werden alle geöffneten Dateien geschlossen (daher werden alle Ausgabeströme geleert), bevor das Programm beendet wird.

Diese beiden Unterabschnitte unterstützen die Möglichkeit, die es geben könnte Sonstiges Anrufe zu main() über die anfängliche/ursprüngliche hinaus.

Ja, wir können main() innerhalb der Funktion main() aufrufen.

Der Vorgang des Aufrufens einer Funktion durch die Funktion selbst wird als Rekursion bezeichnet.

Nun, Sie können main() innerhalb der main()-Funktion aufrufen, aber Sie sollten eine Bedingung haben, die die main()-Funktion nicht aufruft, um das Programm zu beenden.

Andernfalls kehrt das Programm nie zurück und läuft endlos.

  • Es wird einen Stapelüberlauf verursachen, wenn der Stapelplatz aufgebraucht ist.

    – Jens Mühlenhoff

    14. September 2014 um 17:52 Uhr

  • Außer wenn der Compiler Tail-Call-Optimierung durchführt, aber darauf können Sie sich sowieso nicht verlassen, also ist eine endlose Rekursion zu vermeiden.

    – Jens Mühlenhoff

    14. September 2014 um 17:56 Uhr

Ja, du kannst.

Einfaches Programm:

int main()
{
    printf("Anything");
    main();
    return 0;
}

Erläuterung:

EIN call stack oder function stack wird für verschiedene verwandte Zwecke verwendet, aber der Hauptgrund dafür ist, den Punkt zu verfolgen, an den jede aktive Subroutine die Kontrolle zurückgeben sollte, wenn sie ihre Ausführung beendet.

EIN stack overflow tritt auf, wenn zu viel Speicher auf der Aufrufliste verwendet wird.

Hier funktionieren main() wird wiederholt aufgerufen und seine Rücksprungadresse wird im Stack gespeichert. Nachdem der Stapelspeicher voll ist. Es zeigt stack overflow error.

1389540cookie-checkAufruf von main() in main() in c

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy