Zeigerproblem
-
#include <iostream> #include <stdlib.h> using namespace std; int* arrayfunk(void); int main(int argc, char *argv[]) { int *z_array = NULL; z_array = arrayfunk(); for (int i=0; i < 10;i++) { cout <<*(z_array ++)<<" "; } system("PAUSE"); return 0; } int* arrayfunk (void) { int array[10] ={10,10,5,3,54,2,6,8,6,4}; int *test; test = &array[0]; for (int i= 0; i<10;i++) { cout << *(test++); } return test; }
Ich habe bei diesem Programm das Problem das in der Mainfunktion total falsche Werte augegeben werden. In der arrayfunk funktion funktioniert die Ausgabe Problemlos. Bei der Übergabe der Zeiger muss irgendwas schief gehen aber ich find den Fehler einfach nicht.
Danke für die Hilfe
-
Hallo,
dein Array ist eine lokales Array, d. h. nach Beendigung der Funktion,
ist dieses nicht mehr gueltig, du aber gibst einen Zeiger auf das erste
Element dieses lokalen Arrays zurueck, das Programm haette auch abstuerzen
koennen. Eigentlich haette der Kompiler dir ne Warnung ausgeben muessen,
dass du en Zeiger auf ne lokale Variable zurueckgibst.Entweder, du machst das Array static oder du alloziierst dynamisch Speicher
fuer das Array, in diesem Fall musste natuerlich auch den Speicher wieder
freigeben.Einfacher isses glaub ich, wenn de als Parameter en Zeiger auf en char
deklarierst und dann ein Array dieser Funktion uebergibst, die dann damit
arbeitet.mfg
v R
-
int* arrayfunk (void) { int *test; test=new int[10]; .. return test; } main(...) { ... delete [] z_array; .. }
dynamisches anlegen von Arrays. Du gibtst eine Addresse auf ein lokales Array
zurück. Nach dem Funktionsaufruf ist dies wieder freigegeben; ungültig.
Man könnte es auch statisch mit static anlegen.
-
Danke für deine schnelle Antwort jetzt hab ichs verstanden warums nicht geht. Kannst du mir vielleicht noch kurz ein Beispiel machen wie ich mit new so ein Array erzeuge ?
Danke
EDIT
Schon erledigt, danke dein Kollege hat gerade geantwortet als ich den 2. Post abgeschickt habe.
-
int *feld; feld=new int[10];
ist für 1D-Felder
falls Du 2D brauchst geht es soint **feld; *feld=new int[10]; for(int i=0; i<10; i++) feld[i]=new int[10]
für höhere Dimensionen kannst du dies analog fortsetzen
-
daishi schrieb:
int *feld; feld=new int[10];
ist für 1D-Felder
falls Du 2D brauchst geht es soint **feld; *feld=new int[10]; for(int i=0; i<10; i++) feld[i]=new int[10]
für höhere Dimensionen kannst du dies analog fortsetzen
Zu deinem 2. Beispiel:
Das geht? Mache das immer so:
int **feld; feld = new int*[10]; //nun der rest in ner Schleife
mfg
v R
-
Ja, sorry ich habe da einen Fehler, sehn ihn jetzt auch.
DANKE virtuell Realisticer DANKE