Como corrigir especificadores de declaração esperada realloc ou '…' antes do erro 'sizeof'?

Aug 15 2020

Recebo o seguinte erro abaixo após ligar realloc

void* realloc(sizeof(char)100);

O erro:

linex.c: 23: 16: erro: especificadores de declaração esperados ou '...' antes de 'sizeof'

Por favor ajude. Obrigado. :)

Respostas

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

Assumindo que você quer dizer uma chamada para a realloc()função padrão (não uma declaração de um costume realloc()) e deseja redimensionar a memória, este código está errado em relação a três pontos.

1

realloc() precisa de um ponteiro para a memória alocada por um gerenciamento de memória e ainda não liberado como primeiro argumento.

Este é o protótipo / declaração para a realloc()função padrão :

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

Sua realloc()chamada omite este argumento de ponteiro.

2

Não especifique o tipo de retorno (aqui void *) quando quiser chamar uma função. Com isso, você tenta fazer uma nova declaração da função realloc()e não uma chamada.

Se você tentou fazer um casting aqui, também está errado. Para uma conversão implícita, você precisa cercar o tipo a ser convertido entre parênteses, como (void *).

Observe que em ambos os casos o elenco é redundante. Para visualizar o elenco do tipo de retorno, dê uma olhada em:

  • Eu conjuro o resultado de malloc?

3 -

No argumento de tamanho, você precisa do *operador entre sizeof(char)e 100.


Usar:

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

Observe que você também deve sempre verificar o valor de retorno das funções de gerenciamento de memória, independentemente de ter ocorrido um erro ou não:

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

O mesmo que você sempre deve fazer para malloc():

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

Lição avançada (você não precisa entendê-la neste momento):

Observe que, no caso de realloc(), eu uso um ponteiro diferente para capturar o valor de retorno de realloc().

Isso ocorre porque realloc()pode ou não retornar o mesmo ponteiro passado como argumento.

Uma prática infelizmente comum, mas ruim, é reatribuir o ponteiro passado como primeiro argumento pelo valor de retorno de realloc().

Isso é perigoso, pois a referência à memória alocada primeiro pode ser perdida se realloc()alocada outra memória de "substituição", mas não apagada a primeira.

Relacionado:

  • É uma boa prática de codificação atribuir o endereço retornado por realloc () ao mesmo ponteiro?
  • https://stackoverflow.com/a/25435175/12139179
  • Como realloc () realoca a memória?
1 EricPostpischil Aug 15 2020 at 17:35

void* realloc(sizeof(char)*100); é uma mistura de declarar uma função e chamá-la.

Quando declaramos uma função, dizemos qual é o seu tipo de retorno e quais são os tipos de seus parâmetros, como em void *realloc(void *, size_t);. Também podemos fornecer nomes de espaço reservado para os parâmetros como descrições úteis, como em void *realloc(void *pointer, size_t size);. (Os nomes dos parâmetros são obrigatórios ao definir totalmente a função.)

Quando chamamos uma função, não damos nomes de tipo para o valor de retorno ou os parâmetros. Apenas fornecemos expressões que fornecem os valores dos argumentos, como em NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);.

Às vezes, os nomes de tipo podem aparecer em ou perto de uma chamada para uma função, mas são acidentais e não fazem parte diretamente da chamada de função. Exemplos são:

  • char *NewPointer = realloc(OldPointer, 100 * sizeof *NewPointer);: Este código tem char *porque declara e define NewPointer. Em seguida, NewPointeré inicializado com a reallocchamada.
  • NewPointer = (char *) realloc(OldPointer, 100 * sizeof *NewPointer);: Este código tem (char *)como objetivo converter o valor de retorno de reallocum tipo de ponteiro específico. Isso não é necessário em C.
  • NewPointer = realloc(OldPointer, 100 * sizeof(char));: Este código tem char *como operando sizeofpara calcular o espaço necessário. Isso é desnecessário porque o tamanho pode ser assumido com sizeof *NewPointer, e isso geralmente é preferível porque ele se ajusta automaticamente às mudanças na declaração de NewPointer, reduzindo a possibilidade de que um bug possa ser introduzido ao alterar o tipo na declaração de, NewPointermas negligenciando a sizeofexpressão.