Nein, so funktioniert es nicht.
Zeichenfolgenliterale werden im Speicher gespeichert, die so lange bestehen bleiben, wie das Programm ausgeführt wird. Daher gibt die Funktion nur einen Zeiger auf die Zeichenfolgenkonstante zurück.
Zur Laufzeit findet keine String-Erstellung/Initialisierung statt, es werden keine Zeichen kopiert. Es gibt nur einen Zeiger zurück, der Maschinencode der Funktion ist wahrscheinlich nur ein paar Anweisungen.
Zum Beispiel, hier ist die (aufgeräumte) x86 Code, den ich von https://assembly.ynh.io/ bekam:
string_return_function:
movl $.LC0, %eax
ret
Wo .LC0
ist einfach ein Ort, um die Zeichenfolge zu halten. Also, das sind 2 Anweisungen einschließlich der Rückkehr von Functin Overhead/Boilerplate. Ziemlich effizient. :)
Sie dieses Denkens:
char * bad_code(void)
{
char response[] = MY_STRING;
return response;
}
Dies ist fehlerhaftem Code da es ein lokales Array zurückgibt. Es spielt keine Rolle, dass das in Frage stehende Array aus dem Literal initialisiert wird, das ist nicht, was zurückgegeben wird.
Benennen Sie auch nicht Ihre Funktion beginnend mit str
, alle diese Namen sind reserviert; der C11 Entwurf sagt:
Funktionsnamen, die mit str
, mem
oder wcs
und ein Klein Buchstaben beginnen können zu den Erklärungen im <string.h>
Header hinzugefügt werden.
Verdammt, ich bin nicht mehr die schnellste Waffe im Westen :( – Lundin
Danke @unwind! Könnten Sie bitte weitere Informationen über diesen persistenten Speicher geben? Ist es Heap- oder Stack-Speicher? – MayurK
Können Sie bitte erklären letzter Satz? Gibt es eine Standardreferenz oder nur eine Konvention? – deniss