chris_1981_ hat geschrieben:
Ich versuche jetzt mit einem Struct das Array zurück zu geben, bevor man sich an Pointer setzt.
Aber bitte nicht so wie in dem Beispiel von cloidnerux oben (da hat er nicht aufgepaßt).
Das gibt die Adresse einer lokalen, automatischen Variable zurück, die außerhalb der Funktion keine Gültigkeit besitzt. So produziert man sehr schwer zu findende, gemeine Fehler - weil's manchmal tut und meistens nicht, abhängig vom Kontext. Der zurückgegebene Zeiger zeigt nach dem Verlassen der Funktion ins Nirwana.
Grundsätzlich halte ich es für keine besonders gute Idee, zu versuchen, in C Perl-Verhalten nachzubilden. Zumindest nicht mit den Sprachelementen, die Du bislang kennst. Du wirst damit in genau die Probleme reinrennen.
C ist eine "Stack-Maschine", d.h. lokale Variablen, Funktionsparameter und -Rückgabewerte werden (vorwiegend) über den Prozessorstack abgewickelt. Das ist effektiv und schnell für "schmale" Datentypen und bequem für den Compilerbauer (lokale Variablen "verschwinden" von alleine - "automatisch", wenn sie nicht mehr gebraucht werden, deswegen heißen sie auch so: "auto").
Für den Programmierer heißt das allerdings, daß es - (wie schon erwähnt) abgesehen von Strukturen - keine Möglichkeit gibt, aus Funktionen komplexe Datentypen "by value" zurückzugeben. Diese Ausnahme (Struktur) ist so "esoterisch", daß viele Programmierer gar nicht (oder nicht mehr - wenn sie's mal gelernt haben) wissen, daß sie existiert. Ganz nebenbei ist sie nicht besonders effektiv (der Prozessorstack ist für solche Dinge nicht gedacht).
Auch wenn's didaktisch suboptimal ist, trotzdem das Beispiel dazu:
Code: Alles auswählen
#include <stdio.h>
#include <string.h>
struct stringtrick
{
char langer_string[1024];
};
struct stringtrick byValue(void)
{
struct stringtrick s;
strcpy(s.langer_string, "Das ist ein langer String als Funktionsrückgabewert\n");
return s;
}
int main(int argc, char *argv[])
{
printf("%s\n", byValue().langer_string);
}
Ich behaupte: die meisten C-Programmierer wissen gar nicht, daß das geht (und würden auch hier Zeiger, malloc() und free() benutzen). Ich würde empfehlen - auch wenn's geht - es ganz schnell wieder zu vergessen (es ist also nicht schlimm, wenn Du nicht gleich verstehst, was daran so besonders ist).
Lebe mit diesen Restriktionen.
Für dich bedeutet das: solange Du noch nicht weißt, wie man in Funktionen mit dynamischem Speicher umgeht (malloc, free, ...), dürfen sie nur Speicherbereiche zurückgeben, die Du vorher von außen hineingegeben hast. Was wie eine Einschränkung aussieht (und auch eine ist), erzwingt effiziente Programme: die C "Runtime" muß sich nicht mit Gültigkeitsbereichen und automatischen Kopien rumschlagen. Wenn der Programmierer die unbedingt haben will, muß er sie explizit selber hinschreiben.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.