Cómo utilizar realloc en C [duplicado]

Nov 25 2020

Estoy tratando de reasignar memoria usando la función de reasignación, vi que necesita usar malloc antes, pero no entiendo si DEBE usarlo porque digamos que estoy creando la siguiente cadena:

char string[] =  "fun";

¿Funcionaría la función de reasignación si trato de agregar más espacio?

eso me lleva a mi pregunta, estoy tratando de simplemente agregar una letra al final de la cadena, digamos 'p', pero por alguna razón el programa se aplasta en la línea de reasignación cada vez que lo ejecuto.

Aquí está mi código 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");
}

También intenté hacer un puntero a 'cadena' y enviar el puntero, lo que resulta en lo mismo.

Respuestas

1 Lundin Nov 25 2020 at 19:32

¿Funcionaría la función de reasignación si trato de agregar más espacio?

No, porque esa matriz no está asignada en el montón; en su caso, es muy probable que esté asignada en la pila y no se pueda cambiar de tamaño. En pocas palabras: reallocno reconoce el puntero y no sabe qué hacer con él, pero intenta hacer algo de todos modos, de ahí el bloqueo.

Solo puede llamar realloca un puntero que se haya pasado anteriormente malloco a un puntero nulo. Así es como funcionan estas funciones.

Para obtener más información, consulte ¿Qué se asigna en la pila y en el montón? .

1 Useless Nov 25 2020 at 19:58

Vi que necesita usar malloc antes, pero no entiendo si DEBE usarlo

Si necesita usar mallocantes de poder reallocalgo, entonces, por definición, solo debe usar las realloccosas originalmente asignadas malloc.

Estás tratando de encontrar un espacio entre "necesidad" y "obligación" que no existe.

... por alguna razón, el programa se enamora de la reasignación

Ya dijiste que sabes que necesitas usar malloc. Entonces no usó mallocy se pregunta por qué esto es un problema. Al menos podría intentar hacer lo que "sabe" que debe hacer, para ver si eso resuelve el problema.

El programa probablemente debería verse como

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;
  }
}

Su condición original no es del todo correcta: en realidad, el puntero pasó a realloc

... debe ser asignado previamente por malloc(), calloc()o realloc()aún no liberado con una llamada a free o reasignar

[O] Si ptr es NULL, el comportamiento es el mismo que llamar malloc(new_size).

paxdiablo Nov 25 2020 at 19:31

La reallocfunción sólo funciona con cosas que fueron creadas originalmente con un pequeño grupo de funciones de asignación (como malloc, calloco reallocsí), o el puntero nulo. Dado stringque no es ninguna de esas cosas, su código no está bien definido.