Was mich wundert:
Die vernünftigste Variante ist nicht erwähnt.
Möglichkeit 1: statische Variable.
Das kann man machen, sollte man aber nicht ohne guten Grund
machen. Das kann zu zunächst sehr seltsamen Effekten führen.
Möglichkeit 2: Speicher vom Heap
Das problematische daran ist, dass der Aufrufer wissen muss,
das der Speicher am Heap allokiert wurde und ihn wieder freigeben
muss. Zb. im Test-main() passiert das nicht und ich werte das
mal als bösen Fehler.
Möglichkeit 3:
Wie du richtig erkannt hast, ist das genauso fehlerhaft, wie
die allererste Variante
Bleibt noch Möglichkeit 4, die du am häufigsten antreffem wirst:
Der Aufrufer muss den Speicher bereitstellen in den die Funktion
die Daten hineinkopiert. Dabei sollte bei Arrays dann auch gleich
noch die Grösse des Arrays mit übergeben werden, damit die Funktion
prüfen kann, ob seine Daten in den bereitgestellten Speicherbereich
passen.
1 | char* test5(char *result, int maxLength)
|
2 | {
|
3 | if( maxLength > 9 )
|
4 | strcpy(result, "testwert");
|
5 | return result;
|
6 | }
|
7 |
|
8 | int main(void) {
|
9 | char buffer[20];
|
10 |
|
11 | test5( buffer, sizeof(buffer) );
|
12 | printf("test5: %s\n", buffer);
|
13 |
|
14 | return EXIT_SUCCESS;
|
15 | }
|