Come utilizzare realloc in C [duplicate]

Nov 25 2020

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

1 Lundin Nov 25 2020 at 19:32

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? .

1 Useless Nov 25 2020 at 19:58

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()o realloc()e non ancora liberato con una chiamata a free o rialloc

[OR] Se ptr è NULL, il comportamento è lo stesso della chiamata malloc(new_size).

paxdiablo Nov 25 2020 at 19:31

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.