¿Cómo corregir los especificadores de declaración esperados de reasignación o '…' antes del error 'sizeof'?

Aug 15 2020

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

1 RobertSsupportsMonicaCellio Aug 15 2020 at 15:42
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?
1 EricPostpischil Aug 15 2020 at 17:35

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 tiene char *porque declara y define NewPointer. Luego NewPointerse inicializa con la reallocllamada.
  • NewPointer = (char *) realloc(OldPointer, 100 * sizeof *NewPointer);: Este código tiene (char *)una conversión para convertir el valor de retorno realloca un tipo de puntero específico. Esto no es necesario en C.
  • NewPointer = realloc(OldPointer, 100 * sizeof(char));: Este código tiene char *como operando sizeofpara calcular el espacio necesario. Esto es innecesario porque el tamaño se puede tomar con sizeof *NewPointer, y eso generalmente es preferible porque se ajusta automáticamente a los cambios en la declaración de NewPointer, reduciendo la posibilidad de que se introduzca un error al cambiar el tipo en la declaración de NewPointerpero pasando por alto la sizeofexpresión.