008
20.02.2004, 12:47 Uhr
ao
(Operator)
|
Zitat: |
~Susi postete
C++: |
char Funktion() { char erg[100]; .... erg[m]='\n'; cout<<"Ergebnis ist "<<erg; return(erg[100]); }
|
|
Du willst in Wahrheit den ganzen String übergeben und nicht nur ein einzelnes Zeichen, stimmts? Das geht so nicht. Mehrere Fehler.
1. Deine Funktion gibt nur ein einzelnes Zeichen zurück und nicht das ganze Array.
2. Das Array hat 100 Elemente (erreichbar über erg[0] bis erg[99], in C beginnt die Indizierung *immer* bei 0). Im return-Statement greifst du auf das 101. Element zu, das gar nicht definiert ist. Das kann zufälligerweise funktionieren oder auch abstürzen.
3. Arrays werden nicht als Arrays aus Funktionen herausgereicht, sondern als Pointer. Formal richtig wäre also
C++: |
char * Funktion() { char erg[100]; .... erg[m]='\n'; cout<<"Ergebnis ist "<<erg; return erg; }
|
4. Richtig funktionieren würde das aber immer noch nicht, weil erg[] ein lokales Objekt innerhalb der Funktion ist. Dieses Objekt hört auf zu existieren, wenn die Funktion verlassen wird (d.h. an der schließenden Klammer). Du hast als Funktionsergebnis noch einen Zeiger auf das Objekt in der Hand, den du aber nicht mehr benutzen darfst, weil das Objekt nicht mehr lebt; der Speicherbereich darf vom Betriebssystem überschrieben werden. Es kann sein, dass du die richtigen Daten noch rausholen kannst (wenn der Speicher noch nicht überschrieben wurde), trotzdem sollte man so nicht programmieren, denn irgendwann fällt man damit auf den Bauch.
5. Man könnte sich nun in der Funktion dynamisch Speicher holen:
C++: |
char * Funktion() { char *erg = malloc (100); .... erg[m]='\n'; cout<<"Ergebnis ist "<<erg; return erg; }
|
Nachteil ist, dass der Aufrufer von Funktion () wissen muss, dass er den Speicher irgendwann wieder freigeben muss, sonst entsteht ein Speicherleck.
6. Wenn Funktionen Arrays manipulieren, ist es darum am sichersten, wenn der Aufrufer den Speicher bereitstellt und in die Funktion hineinreicht:
C++: |
void Funktion(char * erg, int len) { /* len gibt an, wieviel Platz bei erg reserviert ist Funktion muss diese Groesse beruecksichtigen und darf nicht mehr Zeichen in den Speicherbereich eintragen. */
/* Speicher fuellen */ erg[0] = ......;
/* letztes Zeichen: */ erg [len-1] = ....; }
int main (void) { char erg [100];
Funktion (erg, 100);
/* ... und mit erg was anfangen */ }
|
ao Dieser Post wurde am 20.02.2004 um 12:49 Uhr von ao editiert. |