lokale, zeiger an funktion übergeben, geht nicht so ganz...
-
Moin,
lange her seit dem letzten Post hier, von mir
Aber da bin ich wieder.Ich weiß ja das es bestimmte Wertebereiche für Variablen/Funktionen gibt.
Aber wenn ich eine lokale Variable per Adresse einer anderen Funktion übergebe bzw. einen Zeiger als Parameter übergebe und in der aufzurufenden Funktion die Größe festlege/alloziere.Es ist kein reines C++ Problem, mehr ein C Problem, deswegen bitte nicht über die Klasse wundern.
Aber es funktioniert nicht ganz:
Zum Source: Ich übergebe eine Zeile an die Funktion device und lese die einzelnen Zeilen bis zum ersten leeren Zeichen und will das in die zweite Variable schreiben wofür ich den Speicher alloziere.
unsigned int Klasse::getStat() { char cmd[] = "df -h > .out.tmp"; system( cmd ); FILE *fd; fd = fopen(".out.tmp", "r"); char buffer[512]; while( fgets(buffer, 1024, fd) ) { char *name = NULL; device( name, buffer ); } return 0; } void Klasse::device( char *name, char *zeile ) { char *ptr_zeile_backup = zeile; int count = 0; while( *zeile != ' ' ) { count++; zeile++; } zeile = ptr_zeile_backup; name = (char*) malloc( sizeof(char) * count + 1 ); char *ptr_name_backup = name; while( *zeile != ' ' ) { *name = *zeile; name++; zeile++; } *name = '\0'; name = ptr_name_backup; }
Ich bedanke mich für eure professionelle Hilfe
Mfg
Christian Ries
-
Hallo ...
IMHO willst Du einen Zeiger auf einen Zeiger auf char übergeben. Beispiel:
void f(char **s) { *s = malloc(); /*...*/ } void g(void) { char *t; /* ... */ f(&t); /* <--- */ /* ... */ free(t); /* freigeben nicht vergessen! */ }
Aber mit Deinem Beispiel kann ich ehrlich gesagt nix anfangen. Du hast nebenbei noch einige Fehler drinnen...
-
Danke erst mal,
handelt es sich um logische oder technische Fehler ?
-
naja .... was glaubst Du, macht dieser Code:
char buffer[512]; while( fgets(buffer, 1024, fd) )
-
Das Programm soll mir nur die Werte aus der Ausgabe des Programms "df" unter Linux anzeigen.
Und ohne das ich den kompletten Quelltext dieses Programms durch ackern muss, will ich das einfach so machen, das ich die Ausgabe des Programms (df) in eine Datei peipe und dann Zeilenweise filter.
Derzeitige Lösung sieht nun so aus:
void CGetHDDSpace::name( char **s, const char *zeile ) { char *ptrtmp = (char*) malloc(sizeof(char)); int counter = 0; do { ptrtmp = (char*) realloc( ptrtmp, sizeof(char) ); ptrtmp[counter] = zeile[counter]; } while( zeile[counter++] != ' ' ); ptrtmp[counter] = '\0'; *s = (char*) malloc( sizeof(char) * strlen(ptrtmp) ); strcpy( *s, ptrtmp ); free(ptrtmp); }
SIcherlich noch einiges zu verbessern dran, also bitte, schiesst los.
-
ptrtmp = (char*) realloc( ptrtmp, sizeof(char) );
WIESO vergrösserst Du auch noch in einer Schleife den Zeiger immer und immer wieder auf sizeof(char) Byte?
-
Original erstellt von ciever2k:
**...
Derzeitige Lösung sieht nun so aus:/*...*/ *s = (char*) malloc( sizeof(char) * strlen(ptrtmp) ); strcpy( *s, ptrtmp ); /*...*/
...**
Das solltest Du besser so schreiben:
*s = malloc(strlen(ptrtmp) + 1); strcpy(*s, ptrtmp);
Natürlich sollte dann noch auf Speichermangel geprüft werden.
Manche Systeme bieten für obigen Code die Funktion strdup() an, die genau das macht (Speicher besorgen und String reinkopieren). strdup() ist allerdings kein Standard. Wenn es bei Dir diese Funktion gibt, solltest Du sie verwenden.