¿Cómo corregir los especificadores de declaración esperados de reasignación o '…' antes del error 'sizeof'?
Recibo el siguiente error a continuación después de llamar realloc
void* realloc(sizeof(char)100);
El error:
linex.c: 23: 16: error: especificadores de declaración esperados o '...' antes de 'sizeof'
Por favor ayuda. Gracias. :)
Respuestas
void realloc(sizeof(char)100);
Suponiendo que se refiere a una llamada a la realloc()
función estándar (no una declaración de una costumbre realloc()
) y desea cambiar el tamaño de la memoria, este código es incorrecto con respecto a tres puntos.
1.
realloc()
necesita un puntero a la memoria asignada por una gestión de memoria y no ya liberada como primer argumento.
Este es el prototipo / declaración para la realloc()
función estándar :
void *realloc( void *ptr, size_t new_size );
Su realloc()
llamada omite este argumento de puntero.
2.
No especifique el tipo de retorno (aquí void *
) cuando desee llamar a una función. Con esto intentas hacer una nueva declaración de la función realloc()
y no una llamada.
Si trataste de hacer un casting aquí, esto también está mal. Para un elenco implícito, debe rodear el tipo al que se va a convertir entre paréntesis como (void *)
.
Tenga en cuenta que en ambos casos el reparto es redundante. Con vista al elenco del tipo de retorno, eche un vistazo a:
- ¿Lanzo el resultado de malloc?
3.
En el argumento de tamaño, necesita el *
operador entre sizeof(char)
y 100
.
Utilizar:
realloc( ptr, sizeof(char) * 100 );
Tenga en cuenta que también siempre debe verificar el valor de retorno de las funciones de administración de memoria si ocurrió un error o no:
char * ptr2 = realloc( ptr1, sizeof(char) * 100);
if ( ptr2 == NULL )
{
fputs("Error at resizing the allocated memory!\n", stderr);
// error routine.
}
Lo mismo que siempre debes hacer para malloc()
:
char * ptr1 = malloc( sizeof(char) * 50);
if ( ptr1 == NULL )
{
fputs("Error at memory allocation!\n", stderr);
// error routine.
}
Lección avanzada (no es necesario que la comprenda en este momento):
Tenga en cuenta que en el caso de realloc()
, utilizo un puntero diferente para capturar el valor de retorno de realloc()
.
Esto se debe a realloc()
que puede devolver o no el mismo puntero pasado como argumento.
Una práctica desafortunadamente común pero mala es reasignar el puntero pasado como primer argumento por el valor de retorno de realloc()
.
Esto es peligroso ya que la referencia a la memoria asignada primero puede perderse si se le realloc()
asigna otra memoria de "reemplazo" pero no se borró la primera.
Relacionado:
- ¿Es una buena práctica de codificación asignar la dirección devuelta por realloc () al mismo puntero?
- https://stackoverflow.com/a/25435175/12139179
- ¿Cómo realloc () reasigna la memoria?
void* realloc(sizeof(char)*100);
es una mezcolanza de declarar una función y llamarla.
Cuando declaramos una función, decimos cuál es su tipo de retorno y qué tipos son sus parámetros, como en void *realloc(void *, size_t);
. También podemos proporcionar nombres de marcadores de posición para los parámetros como descripciones útiles, como en void *realloc(void *pointer, size_t size);
. (Los nombres de los parámetros son obligatorios cuando se define completamente la función).
Cuando llamamos a una función, no damos nombres de tipo para el valor de retorno o los parámetros. Simplemente damos expresiones que proporcionan los valores de los argumentos, como en NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);
.
A veces, los nombres de tipos pueden aparecer en una llamada a una función o cerca de ella, pero son incidentales y no forman parte directamente de la llamada a la función. Ejemplos son:
char *NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);
: Este código tienechar *
porque declara y defineNewPointer
. LuegoNewPointer
se inicializa con larealloc
llamada.NewPointer = (char *) realloc(OldPointer, 100 * sizeof *NewPointer);
: Este código tiene(char *)
una conversión para convertir el valor de retornorealloc
a un tipo de puntero específico. Esto no es necesario en C.NewPointer = realloc(OldPointer, 100 * sizeof(char));
: Este código tienechar *
como operandosizeof
para calcular el espacio necesario. Esto es innecesario porque el tamaño se puede tomar consizeof *NewPointer
, y eso generalmente es preferible porque se ajusta automáticamente a los cambios en la declaración deNewPointer
, reduciendo la posibilidad de que se introduzca un error al cambiar el tipo en la declaración deNewPointer
pero pasando por alto lasizeof
expresión.