Wo sind die C / C ++ Hauptfunktionsparameter?
In C/C++, die die main-Funktion bekommt Parameter, die vom Typ char*
.
int main(int argc, char* argv[]){
return 0;
}
argv
ist ein array von char*
und Punkte zu strings. Wo sind diese Zeichenfolge befindet? Sind Sie auf dem heap, stack, oder woanders?
InformationsquelleAutor der Frage remainn | 2010-11-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eigentlich eine Kombination von compiler-Abhängigkeit und Betriebssystem-Abhängigkeit.
main()
ist eine Funktion wie jede andere C-Funktion, so dass die Lage der beiden Parameterargc
undargv
wird, Folgen Sie den standard für den compiler auf der Plattform. z.B. für die meisten C-Compiler für x86-Sie werden auf dem Stapel nur über den return-Adresse und der gespeicherten base pointer (der stack wächst nach unten, zu erinnern). Auf x86_64-Parameter werden in Registern übergeben, soargc
werden in%edi
undargv
werden in%rsi
. Code in der main-Funktion vom compiler generiert, dann kopiert Sie auf den Stapel, und das ist, wo später Verweise zeigen. Dies ist also die Register können verwendet werden für Funktionsaufrufe vonmain
.Den block der
char*
s, argv Punkte und die eigentlichen Sequenzen von Zeichen, die überall sein könnte. Sie beginnen in einigen Betriebssystem angegebenen Speicherort und kopiert werden können, die von der pre-amble-code, generiert der linker den stack oder sonstwo. Müssen Sie Blick auf den code fürexec()
- und die assembler-pre-amble, erzeugt durch den linker zu finden.InformationsquelleAutor der Antwort JeremyP
Sind Sie compiler-magic, und von der Implementierung abhängig.
InformationsquelleAutor der Antwort Stu
Hier ist, was der C-standard (n1256) sagt:
Den letzten Punkt ist der interessanteste, wrt, wo der string-Werte gespeichert werden. Es ist nicht angegeben, heap oder stack, aber es erfordert, dass die strings beschreibbar sein und haben statische Umfang, welche Orte einige Grenzen auf, in denen die Zeichenfolge Inhalte platziert sein können. Wie schon andere gesagt haben, die genauen details hängen von der Umsetzung.
InformationsquelleAutor der Antwort John Bode
Die Antwort auf diese Frage ist compiler-abhängig. Das bedeutet es wird Sie nicht behandelt, in der C-Norm, so kann jeder umsetzen, wie er oder Sie möchte. Dies ist normal, da auch Betriebssysteme haben nicht eine gemeinsame akzeptierte, standardisierte Möglichkeit Prozesse zu starten und zu beenden.
Stellen wir uns eine einfache, warum-nicht-Szenario.
Den Prozess erhält durch einen bestimmten Mechanismus die Argumente geschrieben in der Befehlszeile. argc ist dann nur ein int, die gedrückt wird, um den Stapel von der bootstrap-Funktion der compiler setzen, da der Einstieg in den Prozess der Programm (Teil der Spielzeit). Die tatsächlichen Werte sind vom Betriebssystem und kann, sagen, geschrieben in einem Speicher-block des Heap. Dann die argv-Vektor aufgebaut wird, und die Adresse seiner ersten position auch auf den Stapel gelegt.
Dann ist die Funktion main(), die bereitgestellt werden müssen, die durch den Programmierer, ist aufgerufen, und Ihr Rückgabewert wird gespeichert für später (fast sofortige) verwenden. Die Strukturen im Heap freigegeben werden, und der exit-code, die für main wird exportiert, um das Betriebssystem. Der Prozess endet.
InformationsquelleAutor der Antwort Baltasarq
Diese Parameter sind nicht anders als jede andere Funktion, Parameter.
Wenn die Architektur die Aufruf-Sequenz erfordert die Parameter zu Durchlaufen, stack Sie sind auf Stapel. Wenn, wie auf, x86-64 einige Parameter in Registern, diese gehen auch in Registern.
InformationsquelleAutor der Antwort horsh
Als viele andere Antworten hier zeigen, ist der exakte Mechanismus, der eine compiler-implementation verwendet, um Argumente zu main ist nicht spezifiziert durch den standard (wie ist der Mechanismus ein compiler verwendet zum übergeben von Argumenten an eine Funktion). Streng genommen, die compiler müssen ja auch nicht passieren, etwas sinnvolles in diese Parameter, da die Werte durch die Implementierung festgelegt. Aber weder von diesen sind vor allem hilfreichen Antworten.
Den typischen C (oder C++) - Programm ist zusammengestellt für das, was ist bekannt als 'hosted' - execution-environment - (mit der Funktion
main()
als Ausgangspunkt des Programms ist eine der Voraussetzungen für eine gehostete Umgebung). Die wichtige Sache zu wissen ist, dass der compiler ordnet die Dinge so, daß, wenn die ausführbare Datei gestartet wird, indem das Betriebssystem, die compiler, die runtime wird die Kontrolle zunächst - nicht diemain()
Funktion. Die runtime-Initialisierung-code führt, was Initialisierung ist erforderlich, einschließlich der Zuweisung von Speicher für die Argumente zumain()
dann übergibt er die Kontrolle anmain()
.Des Speichers für die Argumente
main()
könnte kommen aus dem heap zugewiesen werden können, die auf dem stack (evtl. mit Hilfe von Techniken, die nicht standard-C-code), oder könnte die Verwendung von statisch zugewiesenen Speicher, wenn das eine weniger wahrscheinliche option, nur weil es weniger flexibel. Der standard erfordert, dass der verwendete Speicher für die Zeichenfolgen aufargv
modifizierbar sind und dass änderungen an diesen string beibehalten, während das Programm Lebensdauer.Nur bewusst sein, dass vor der Ausführung erreicht
main()
einiges an code wurde bereits ausgeführt, dass das einrichten der Umgebung für Ihr Programm zu laufen.InformationsquelleAutor der Antwort Michael Burr
Das argument Liste ist Teil des Prozesses Umwelt, ähnlich (aber Verschieden von) environment-Variablen.
InformationsquelleAutor der Antwort Chris
In der Regel nicht bekannt ist, wo Sie sind.
InformationsquelleAutor der Antwort pmg
Als
pmg
erwähnt, wennmain
rekursiv aufgerufen wird, ist es an den Anrufer, wo die Argumente zeigen. Im Grunde ist die Antwort auf den ursprünglichen Aufruf vonmain
außer, dass der "Anrufer" ist die C-Implementierung/OS.Auf UNIX - -y-Systeme, die Zeichenfolgen, die
argv
Punkte, dieargv
Zeiger selbst, und der Prozess das erste environment-Variablen werden fast immer gespeichert, ganz oben auf dem Stapel.InformationsquelleAutor der Antwort R..
Während Sie in der Lage sind, um Zugang zu den eigentlichen Parametern, ich denke, Ihre tatsächliche Lage überhaupt keine Rolle.
InformationsquelleAutor der Antwort ebasconp