Christian Seiler: Einige C-Fragen

Beitrag lesen

Hallo Martin,

Nein, der Speicherbereich, auf den output zeigt, wird hier *nicht* auf dem Stack alloziert. Der String "Output" ist nämlich (weil's ein String ist, der 1:1 in der Source-Datei vorkommt) schon in der ausführbaren Datei, die Du erstellst, enthalten und wird beim Laden des Programms in den Speicher geladen (genau so wie alle anderen Strings die Du direkt in den Source schreibst). Auf diesen (im Programm immer verfügbaren) Speicherbereich zeigt dann output, das Du zurückgibst.

guter Hinweis, daran habe ich nicht gedacht.
Das *kann* sein, muss aber nicht. Ob konstante Strings direkt im Code gespeichert und direkt referenziert werden, ist nämlich vom Compiler (bzw. dessen Optionen) abhängig.

Nein, ISO C 99 (PDF, 3.6 MiB) sagt ganz klar (§ 6.5.2.5, Seite 77):

| EXAMPLE 5      The following three expressions have different meanings:
|          "/tmp/fileXXXXXX"
|          (char []){"/tmp/fileXXXXXX"}
|          (const char []){"/tmp/fileXXXXXX"}
| The first always has static storage duration and has type array of char,
| but need not be modifiable; the last two have automatic storage duration
| when they occur within the body of a function, and the first of these two
| is modifiable.

Betonung liegt hierbei auf dem Satz: "The first always has static storage". Zu "static storage" sagt der Standard in § 6.2.4, Seite 32:

| An object whose identifier is declared with external or internal linkage,
| or with the storage-class specifier static has static storage duration. Its
| lifetime is the entire execution of the program and its stored value is
| initialized only once, prior to program startup.

Das heißt: Eine Funktion, die return "foo"; oder char *p = "foo"; return foo; macht, wird nach dem C-Standard immer funktionieren und niemals Probleme machen.

Zudem: Es wäre für den Compiler ziemlich unsinnig, bei char *p = "foo" extra noch Code zu generieren (!), der den Inhalt von "foo" extra auf dem Stack abglegt - müsste bei jedem Betreten der Funktion ja geschehen.

Viele Grüße,
Christian