PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] realloc liefert NULL zurück


Marscel
2010-09-09, 23:14:00
Ich hab da ein kleines Programm, das ich zur Auffrischung mal in C schreiben will, das hat diese Zeilen.

char* user = "root";
//...
try_param(argc, argv, index, &user);
//...

try_param soll einfach gucken, obs noch Parameter gibt und wenn ja, in den in user gepointeten Bereich schreiben.

int try_param(int argc, char** argv, int index, char** option) {
if(index >= (argc-1)) {
return 0;
}
(*option) = realloc(*option, strlen(argv[index]) + 1);
(*option) = strcpy(*option, argv[index]);
return 1;
}

Ich vergrößer hier also ggf. den Speicher um Parameterlänger + 1 und sorge dafür, dass der überlieferte Pointer aktualisiert wird. Dann will ich ich den Parameter da rein schreiben. realloc() liefert allerdings NULL zurück, errno sagt mir "invalid argument". Aber was und warum? Die Dereferenzierung von option sollte ja ein char* sein, strlen gibt mir die Größe zurück.

Gerade steh ich auf dem Schlauch.

ShadowXX
2010-09-09, 23:34:08
Ich hab da ein kleines Programm, das ich zur Auffrischung mal in C schreiben will, das hat diese Zeilen.

char* user = "root";
//...
try_param(argc, argv, index, &user);
//...

try_param soll einfach gucken, obs noch Parameter gibt und wenn ja, in den in user gepointeten Bereich schreiben.

int try_param(int argc, char** argv, int index, char** option) {
if(index >= (argc-1)) {
return 0;
}
(*option) = realloc(*option, strlen(argv[index]) + 1);
(*option) = strcpy(*option, argv[index]);
return 1;
}

Ich vergrößer hier also ggf. den Speicher um Parameterlänger + 1 und sorge dafür, dass der überlieferte Pointer aktualisiert wird. Dann will ich ich den Parameter da rein schreiben. realloc() liefert allerdings NULL zurück, errno sagt mir "invalid argument". Aber was und warum? Die Dereferenzierung von option sollte ja ein char* sein, strlen gibt mir die Größe zurück.

Gerade steh ich auf dem Schlauch.

realloc funktioniert nur wie malloc wenn der erste Parameter NULL ist...das ist er bei dir nicht.
http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

Marscel
2010-09-10, 00:06:11
realloc funktioniert nur wie malloc wenn der erste Parameter NULL ist...das ist er bei dir nicht.
http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

Richtig, der erste Parameter ist nicht NULL, der zeigt auf den Standardusernamen (und ist damit doch legal alloziiert?). Ich will ja gar kein malloc, sondern dass der existierende Speicherbereich der Stringlänge angepasst wird. Und da dabei u.U. die Speicheradresse neu vergeben werden kann, hol ich mir diese ab.

Neomi
2010-09-10, 02:06:17
Wenn *option mit malloc(size), realloc(NULL, size) oder irgendwas anderem kompatiblen initial allokiert wurde, dann, und nur dann, kannst du diesen Speicher mit realloc verändern oder mit free freigeben. Wie wurde denn *option genau initialisiert?

Marscel
2010-09-10, 08:24:55
Wenn *option mit malloc(size), realloc(NULL, size) oder irgendwas anderem kompatiblen initial allokiert wurde, dann, und nur dann, kannst du diesen Speicher mit realloc verändern oder mit free freigeben. Wie wurde denn *option genau initialisiert?

char* user = "root";
try_param(..., &user);

Womit *option == user wäre, oder? malloc() wird natürlich nicht explizit hier aufgerufen, char*-Strings können doch direkt durch Zuweisung initialisiert werden?

Ectoplasma
2010-09-10, 08:33:09
char* user = "root";
try_param(..., &user);

Womit *option == user wäre, oder? malloc() wird natürlich nicht explizit hier aufgerufen, char*-Strings können doch direkt durch Zuweisung initialisiert werden?

Strings können so initialisiert werden. Diese Initialisierung ist aber statisch und hat nichts mit malloc oder realloc zu tun. Du musst, wie Neomi schon sagte, initial mit malloc oder realloc(NULL, ...) arbeiten.

Marscel
2010-09-10, 08:43:38
Ah, Ok. Dachte, man könne sich das vielleicht einfach machen. Aber nagut, danke, dann funktionierts.