Cómo utilizar realloc en C [duplicado]
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
¿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? .
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()orealloc()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).
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.