Comment corriger les spécificateurs de déclaration attendue de realloc ou l'erreur '…' avant 'sizeof'?

Aug 15 2020

J'obtiens l'erreur suivante ci-dessous après avoir appelé realloc

void* realloc(sizeof(char)100);

L'erreur:

linex.c: 23: 16: erreur: spécificateurs de déclaration attendus ou '...' avant 'sizeof'

Veuillez aider. Je vous remercie. :)

Réponses

1 RobertSsupportsMonicaCellio Aug 15 2020 at 15:42
void realloc(sizeof(char)100);

En supposant que vous vouliez dire un appel à la realloc()fonction standard (pas une déclaration de personnalisation realloc()) et que vous vouliez redimensionner la mémoire, ce code est erroné sur trois points.

1.

realloc() a besoin d'un pointeur vers la mémoire allouée par une gestion de la mémoire et non déjà libérée comme premier argument.

Voici le prototype / déclaration de la realloc()fonction standard :

void *realloc( void *ptr, size_t new_size );

Votre realloc()appel omet cet argument de pointeur.

2.

Ne spécifiez pas le type de retour (ici void *) lorsque vous souhaitez appeler une fonction. Avec cela, vous essayez de faire une nouvelle déclaration de la fonction realloc()et non un appel.

Si vous avez essayé de faire un casting ici, c'est également faux. Pour un cast implicite, vous devez entourer le type à convertir par des parenthèses comme (void *).

Notez que dans les deux cas, la distribution est redondante. Avec vue sur la distribution du type de retour, jetez un œil à:

  • Dois-je lancer le résultat de malloc?

3.

Au niveau de l'argument de taille, vous avez besoin de l' *opérateur entre sizeof(char)et 100.


Utilisation:

realloc( ptr, sizeof(char) * 100 );

Notez que vous devez également toujours vérifier la valeur de retour des fonctions de gestion de la mémoire, qu'une erreur se soit produite ou non:

char * ptr2 = realloc( ptr1, sizeof(char) * 100);
if ( ptr2 == NULL )
{
    fputs("Error at resizing the allocated memory!\n", stderr);
    // error routine.
}

Vous devriez toujours faire la même chose pour malloc():

char * ptr1 = malloc( sizeof(char) * 50);
if ( ptr1 == NULL )
{
    fputs("Error at memory allocation!\n", stderr);
    // error routine.
}

Leçon avancée (vous n'avez pas besoin de la comprendre à ce stade):

Notez que dans le cas de realloc(), j'utilise un pointeur différent pour attraper la valeur de retour de realloc().

C'est parce que realloc()peut ou peut ne pas retourner le même pointeur passé en argument.

Une pratique malheureusement courante mais mauvaise consiste à réaffecter le pointeur passé comme premier argument par la valeur de retour de realloc().

Ceci est dangereux car la référence à la mémoire allouée en premier peut alors être perdue si realloc()une autre mémoire "de remplacement" est allouée mais n'a pas effacé la première.

En relation:

  • Est-ce une bonne pratique de codage d'attribuer l'adresse renvoyée par realloc () au même pointeur?
  • https://stackoverflow.com/a/25435175/12139179
  • Comment realloc () réalloue-t-il la mémoire?
1 EricPostpischil Aug 15 2020 at 17:35

void* realloc(sizeof(char)*100); est un méli-mélo de déclaration d'une fonction et de son appel.

Lorsque nous déclarons une fonction, nous disons quel est son type de retour et quels types sont ses paramètres, comme dans void *realloc(void *, size_t);. Nous pouvons également fournir des noms d'espace réservé pour les paramètres sous forme de descriptions utiles, comme dans void *realloc(void *pointer, size_t size);. (Les noms de paramètres sont requis lors de la définition complète de la fonction.)

Lorsque nous appelons une fonction, nous ne donnons pas de noms de type pour la valeur de retour ou les paramètres. Nous donnons simplement des expressions qui fournissent les valeurs d'argument, comme dans NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);.

Parfois, les noms de type peuvent apparaître dans ou à proximité d'un appel à une fonction, mais ils sont accessoires et ne font pas directement partie de l'appel de fonction. Des exemples sont:

  • char *NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);: Ce code a char *parce qu'il déclare et définit NewPointer. Puis NewPointerest initialisé avec l' reallocappel.
  • NewPointer = (char *) realloc(OldPointer, 100 * sizeof *NewPointer);: Ce code a (char *)pour conversion la valeur de retour de reallocen un type de pointeur spécifique. Ce n'est pas nécessaire dans C.
  • NewPointer = realloc(OldPointer, 100 * sizeof(char));: Ce code a char *pour opérande to sizeofpour calculer l'espace nécessaire. Ceci est inutile car la taille peut être prise avec sizeof *NewPointer, et c'est généralement préférable car elle s'ajuste automatiquement aux changements dans la déclaration de NewPointer, réduisant la possibilité qu'un bogue puisse être introduit en changeant le type dans la déclaration de NewPointermais en ignorant l' sizeofexpression.