Verwendung von Realloc in C [Duplikat]
Ich versuche, Speicher mithilfe der Realloc-Funktion neu zuzuweisen. Ich habe gesehen, dass Sie zuvor malloc verwenden müssen, aber ich verstehe nicht, ob Sie es verwenden MÜSSEN, da ich beispielsweise die folgende Zeichenfolge erstelle:
char string[] = "fun";
Würde die Realloc-Funktion funktionieren, wenn ich versuchen würde, mehr Speicherplatz hinzuzufügen?
das bringt mich zu meiner Frage, ich versuche einfach einen Buchstaben am Ende der Zeichenfolge hinzuzufügen, sagen wir 'p', aber aus irgendeinem Grund zerquetscht das Programm jedes Mal, wenn ich es ausführe, die Realloc-Zeile.
Hier ist mein vollständiger Code:
int main()
{
char string[] = "fun" ;
str_func(string);
printf("%s", string);
return 0;
}
void str_func(char* str)
{
str = (char*)realloc(str, strlen(str) + 2);
strcat(str, "p");
}
Ich habe auch versucht, einen Zeiger auf 'string' zu erstellen und den Zeiger zu senden, was dasselbe ergibt.
Antworten
Würde die Realloc-Funktion funktionieren, wenn ich versuchen würde, mehr Speicherplatz hinzuzufügen?
Nein, da dieses Array nicht auf dem Heap zugeordnet ist. In Ihrem Fall ist es sehr wahrscheinlich auf dem Stapel zugeordnet und kann nicht in der Größe geändert werden. Einfach ausgedrückt: realloc
erkennt den Zeiger nicht und weiß nicht, was er damit anfangen soll, versucht aber trotzdem, etwas zu tun, daher der Absturz.
Sie können nur realloc
einen Zeiger aufrufen , der zuvor übergeben wurde malloc
, oder einen Nullzeiger. So funktionieren diese Funktionen.
Weitere Informationen finden Sie unter Was wird auf dem Stapel und dem Heap zugewiesen? .
Ich habe gesehen, dass Sie Malloc vorher verwenden müssen, aber ich verstehe nicht, ob Sie es verwenden müssen
Wenn Sie etwas verwenden müssen , malloc
bevor Sie realloc
etwas können, müssen Sie per Definition nur realloc
Dinge verwenden, die ursprünglich zugewiesen wurden malloc
.
Sie versuchen, einen Platz zwischen "Bedürfnis" und "Muss" zu finden, der nicht existiert.
... aus irgendeinem Grund zerquetscht das Programm die Realloc
Du hast gesagt , wissen Sie bereits , Sie brauchen zu verwenden malloc
. Dann haben Sie nicht verwendet malloc
, und Sie fragen, warum dies ein Problem ist. Sie könnten zumindest versuchen , das zu tun, was Sie "wissen", um zu sehen, ob das Problem dadurch gelöst wird.
Das Programm sollte wahrscheinlich so aussehen
int main()
{
/* array is an automatic local variable. It wasn't dynamically allocated
in the first place, so can't be dynamically re-allocated either.
You cannot (and don't need to) free it either, it just goes out of scope
like any other automatic variable.
*/
char array[] = "fun";
/* you need to use malloc (or one of the other dynamic allocation functions)
before you can realloc, as you said yourself */
char *dynamic = malloc(1+strlen(array));
memcpy(dynamic, array, 1+strlen(array));
/* realloc can move your data, so you must use the returned address */
dynamic = str_func(dynamic);
printf("old:'%s', new:'%s'\n", array, dynamic);
/* not really essential since the program is about to exit anyway */
free(dynamic);
}
char* str_func(char* str)
{
char* newstr = realloc(str, strlen(str) + 2);
if (newstr) {
strcat(newstr, "p");
return newstr;
} else {
/* we failed to make str larger, but it is still there and should be freed */
return str;
}
}
Ihr ursprünglicher Zustand ist nicht ganz korrekt: Eigentlich wurde der Zeiger an übergeben realloc
... muss zuvor zugewiesen werden
malloc()
,calloc()
oderrealloc()
und noch nicht mit einem Anruf befreit zu befreien oder realloc
[ODER] Wenn ptr NULL ist, entspricht das Verhalten dem Aufruf
malloc(new_size)
.
Die realloc
Funktion arbeitet nur mit den Dingen , die ursprünglich mit einer kleinen Gruppe von Zuordnungsfunktionen (wie geschaffen wurden malloc
, calloc
oder realloc
sich selbst) oder der Null - Zeiger. Da dies string
keines dieser Dinge ist, ist Ihr Code nicht genau definiert.