Como corrigir especificadores de declaração esperada realloc ou '…' antes do erro 'sizeof'?
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
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?
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 temchar *
porque declara e defineNewPointer
. Em seguida,NewPointer
é inicializado com arealloc
chamada.NewPointer = (char *) realloc(OldPointer, 100 * sizeof *NewPointer);
: Este código tem(char *)
como objetivo converter o valor de retorno derealloc
um tipo de ponteiro específico. Isso não é necessário em C.NewPointer = realloc(OldPointer, 100 * sizeof(char));
: Este código temchar *
como operandosizeof
para calcular o espaço necessário. Isso é desnecessário porque o tamanho pode ser assumido comsizeof *NewPointer
, e isso geralmente é preferível porque ele se ajusta automaticamente às mudanças na declaração deNewPointer
, reduzindo a possibilidade de que um bug possa ser introduzido ao alterar o tipo na declaração de,NewPointer
mas negligenciando asizeof
expressão.