2016-04-07 8 views
1

Ist es zulässig, eine Struktur zurückzugeben, die ein lokales Array in C enthält?Zurückgeben einer Struktur mit einem lokalen Zeiger in C

zum Beispiel:

// Define a string type 
typedef struct { 
    char* c_str; 
} string; 

// Function to append 2 strings 
string string_append(string str1, const string str2) { 

    // Create a local array 
    char buffer[strlen(str1.c_str) + strlen(str2.c_str) + 1]; 

    strcpy(buffer, str1.c_str); 
    strcat(buffer, str2.c_str); 

    // Store a pointer to the local array in a struct 
    string ret = { buffer }; 

    return ret; 
} 

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

    string str1 = { "hello" }; 
    string str2 = { "goodbye" }; 
    string str3 = string_append(str1, str2); 
} 

Wird der Inhalt von str3 gültig string_append nach der Durchführung?

+0

Ihre Struktur ** enthält kein Array: Es enthält einen Zeiger. In Abschnitt 6 der [c-faq] (http://c-faq.com) finden Sie weitere Informationen zu den Unterschieden zwischen Array und Zeiger. – maraguida

+0

Ich werde die Frage klären. Was ich frage ist, würde der Inhalt des Arrays, auf den die Struktur verweist, kompromittiert sein? – tjwrona1992

+2

Sie werden nicht gültig sein. Du kannst das nicht tun. –

Antwort

1

Okay, wie in den Kommentaren angemerkt, können Sie dies nicht tun. Aber warum?

Die Antwort ist, dass Ihr Code

char buffer[strlen(str1.c_str) + strlen(str2.c_str) + 1]; 

automatische Speicher zuteilt, das heißt, es als Teil des Stapels erstellt wird, die auch die Absenderadresse für die Funktion enthält, und die Argumente. Wenn Sie also von der Funktion zurückkehren, ist der zugewiesene Speicherplatz möglicherweise nicht beschädigt, wenn Sie versuchen, ihn zu verwenden.

2

Sobald Ihre Funktion zurückkehrt, ist der Inhalt von buffer undefiniert. Wenn Sie etwas innerhalb Ihrer Funktion erstellen möchten, das außerhalb der Funktion existieren kann, müssen Sie es mit malloc (oder etwas Äquivalent) zuweisen.

+0

Wenn ich eine mit malloc zugewiesene Variable zurücksende, wie kann ich leicht sicherstellen, dass jeder, der meine Funktion benutzt, weiß, dass er freigegeben werden muss? – tjwrona1992

+0

@ tjwrona1992: Durch eine schön geschriebene Dokumentation. – alk

+0

@alk: Ich habe immer noch das Gefühl, eine Malloced-Variable aus einer Funktion zurückzugeben, ist nur ein Speicherleck, das darauf wartet, in den Händen einiger schlechter unerfahrener Entwickler zu passieren. – tjwrona1992

0

Ihr buffer Zeichenarray wird innerhalb der Funktion erstellt. Die Standardspeicherklasse der in der Funktion erstellten Variablen ist Automatic.

Das bedeutet, dass Ihre Variable als Teil des Stapels erstellt wird. Wenn die Funktion jedoch zurückkehrt und die Steuerung an die aufrufende Funktion geht, wird dieser Stapel bald geändert, falls Ihre aufrufende Funktion eine andere Funktion aufruft. Zum Beispiel, wenn Sie printf() nach der string_append() Funktion aufrufen. Der für printf() erstellte Stapel überschreibt den Speicherort, auf den char *c_str pointer of string str3 zeigt. Und es werden einige Müllwerte gedruckt.

Probieren Sie es aus.

Verwandte Themen