Come utilizzare realloc in C [duplicate]
Sto cercando di riallocare la memoria usando la funzione realloc, ho visto che devi usare malloc prima ma non capisco se DEVI usarlo perché diciamo che sto creando la seguente stringa:
char string[] = "fun";
la funzione realloc funzionerebbe se provassi ad aggiungere più spazio?
questo mi porta alla mia domanda, sto cercando di aggiungere semplicemente una lettera alla fine della stringa, diciamo 'p', ma per qualche motivo il programma si schiaccia sulla riga di riallocazione ogni volta che lo eseguo.
Ecco il mio codice completo:
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");
}
Ho anche provato a creare un puntatore a "stringa" e inviare il puntatore, il che risulta la stessa cosa.
Risposte
la funzione realloc funzionerebbe se provassi ad aggiungere più spazio?
No, perché quell'array non è allocato nell'heap - nel tuo caso è molto probabilmente allocato nello stack e non può essere ridimensionato. In poche parole: reallocnon riconosce il puntatore e non sa cosa farne, ma cerca di fare comunque qualcosa, da qui il crash.
È possibile chiamare solo reallocun puntatore a cui è stato precedentemente passato malloco un puntatore null. È così che funzionano queste funzioni.
Per i dettagli, vedere cosa viene allocato nello stack e nell'heap? .
Ho visto che devi usare malloc prima ma non capisco se DEVI usarlo
Se hai bisogno di usare mallocprima di poter reallocqualcosa, allora per definizione devi solo le realloccose originariamente assegnate con malloc.
Stai cercando di trovare uno spazio tra "bisogno" e "must" che non esiste.
... per qualche motivo il programma schiaccia il rialloc
L'hai già detto sai che bisogno di usare malloc. Quindi non hai usato malloce stai chiedendo perché questo è un problema. Potresti almeno provare a fare la cosa che "sai" di dover fare, per vedere se questo risolve il problema.
Il programma dovrebbe probabilmente avere l'aspetto
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;
}
}
La tua condizione originale non è del tutto corretta: in realtà il puntatore è passato a realloc
... deve essere preventivamente allocato da
malloc(),calloc()orealloc()e non ancora liberato con una chiamata a free o rialloc
[OR] Se ptr è NULL, il comportamento è lo stesso della chiamata
malloc(new_size).
La reallocfunzione funziona solo con cose originariamente creati con un piccolo gruppo di funzioni di allocazione (ad esempio malloc, calloco reallocse stesso), oppure il puntatore nullo. Poiché stringnessuna di queste cose è, il tuo codice non è ben definito.