array ausgeben
-
Mach mal
static char bla[4];
Ohne static ist bla nach verlassen der Funktion nicht mehr gültig. Es _kann_ funktionieren, aber verlassen kann man sich darauf nicht (wie eben bei dir).
Zu:
return bla; //das ist doch ein Char*, oder?
Dazu empfehle ich folgende Lektüre:
http://www.c-faq.com/aryptr/aryptr2.html
http://www.c-faq.com/aryptr/aryptrequiv.htmlOder gleich das ganze Kapitel:
http://www.c-faq.com/aryptr/index.htmlOder am besten die ganze FAQ
(ist imho die beste wo gibt):
http://www.c-faq.com/
-
Ist halt leider english...
Aber ich versuche es trotzdem zu verstehen.Mit static klappt es.
Da muss ich ja nicht static int schreiben:
#include <stdio.h> int test() { int temp=4; return temp; } int main() { printf("%d",test()); getchar(); }
Ich hatte gedacht, das das so ähnlich wäre.
-
Nein! ints (genau wie chars, longs, ...) die nichts mit Zeigern
zu tun haben, können zurückgegeben werden.
-
Und wenn ich den Zeiger in einen Int caste?
Die sind ja beide 4 Bytes groß.(Verstehe ich überhaupt das richtige unter Casts?)
-
Schon aber dann gibst du nur die Adresse, an der deine Daten stehen, zurück.
Aber der Speicher unter der zurückgegebenen Adresse wird beim nächsten
Funktionsaufruf wieder benutzt und eventuell überschrieben.
-
obbba schrieb:
Und wenn ich den Zeiger in einen Int caste?
mit casten geht's nicht, höchstens so:
// nur wenn sizeof(int) == 4 int test (void) { int x; char *p = (char*)&x; *p++ = 'm'; *p++ = 'u'; *p++ = 'h'; *p = 0; return x; }
-
strings sind zeichenketten irgendwo im speicher.
char* sind zeiger auf zeichen(ketten).ein char[] ist ein array von chars.
wenn du ein array zurueckgibst, gibst du die adresse des ersten elements zurueck.
arrays verschwinden, wenn du die funktion verlaesst.
in folgendem code zeigt <quux> in die pampa, denn das array wird bei der rueckkehr der funktion zerstoert.
char *func(void) { char foo[] = "hallo"; return foo; } char *quux = func();
ein "static" vor die arraydefinition setzen bewirkt, dass du bei jedem return den gleichen pointer kriegen wuerdest und nach dem return der speicher noch nicht freigegeben ist.
"string" ist kein datentyp. es gibt nur "pointer auf char" und "array von chars" und arrays kannst du nur als zeiger an funktionen uebergeben oder zurueckgeben.
-
Als Alternative zu dem "static" (damit arbeitet jeder Funktionsaufruf mit dem selben Array, überschreibt also möglicherweise Daten, die du an anderer Stelle noch brauchen könntest) kannst du noch den Speicher auf dem Heap anfordern (mit malloc() und Co. - das Hauptprogramm muß ihn dann per free() freigeben) oder von außen übergeben bekommen (als Parameter).
-
Ist das die strdup methode?
-
Hab ich zwar noch nie angewendet, aber ja: strdup() dürfte den neuen Speicher per malloc() anfordern.
(ich arbeite eher mit C++ - und dann mit Objekten wie string oder vector, die ihren Speicher selber veralten)
-
Ah, mit 'string' hat man die ganzen Scheissereien nicht mehr? Klingt cool. Danke. :-).
-
"string" ist nicht mehr c und in c++ sind strings keine typen erster klasse. stringliterale sind immernoch char*...