Como usar realloc em C [duplicado]

Nov 25 2020

Estou tentando realocar memória usando a função realloc, vi que você precisa usar malloc antes, mas não entendo se você DEVE usá-lo porque digamos que estou criando a seguinte string:

char string[] =  "fun";

a função realocar funcionaria se eu tentar adicionar mais espaço?

Isso me leva à minha pergunta, estou tentando simplesmente adicionar uma letra no final da string, digamos 'p', mas por algum motivo o programa quebra na linha de realocação toda vez que eu o executo.

Aqui está meu código completo:

int main()
{
char string[] =  "fun" ;
str_func(string);
printf("%s", string);
return 0;
} 

void str_func(char* str)
{
str = (char*)realloc(str, strlen(str) + 2);
strcat(str, "p");
}

Também tentei fazer um ponteiro para 'string' e enviar o ponteiro, o que resultou na mesma coisa.

Respostas

1 Lundin Nov 25 2020 at 19:32

a função realocar funcionaria se eu tentar adicionar mais espaço?

Não, porque essa matriz não está alocada no heap - no seu caso, é muito provável que esteja alocada na pilha e não possa ser redimensionada. Simplificando: reallocnão reconhece o ponteiro e não sabe o que fazer com ele, mas tenta fazer algo mesmo assim, daí a falha.

Você só pode chamar reallocum ponteiro que foi passado anteriormente mallocou um ponteiro nulo. É assim que essas funções funcionam.

Para obter detalhes, consulte O que é alocado na pilha e no heap? .

1 Useless Nov 25 2020 at 19:58

Eu vi que você precisa usar malloc antes, mas não entendo se você DEVE usá-lo

Se você precisa usar mallocantes de fazer reallocalgo, então, por definição, você deve apenas realloccoisas originalmente alocadas com malloc.

Você está tentando encontrar algum espaço entre "necessidade" e "obrigação" que não existe.

... por algum motivo, o programa esmaga o realocação

Você já disse que sabe que precisa usar malloc. Então você não usou malloce está perguntando por que isso é um problema. Você poderia pelo menos tentar fazer o que "sabe" que precisa fazer, para ver se isso resolve o problema.

O programa provavelmente deve ser semelhante a

int main()
{
  /* array is an automatic local variable. It wasn't dynamically allocated
     in the first place, so can't be dynamically re-allocated either.
     You cannot (and don't need to) free it either, it just goes out of scope
     like any other automatic variable.
  */
  char array[] = "fun";

  /* you need to use malloc (or one of the other dynamic allocation functions)
     before you can realloc, as you said yourself */
  char *dynamic = malloc(1+strlen(array));
  memcpy(dynamic, array, 1+strlen(array));

  /* realloc can move your data, so you must use the returned address */
  dynamic = str_func(dynamic);
  printf("old:'%s', new:'%s'\n", array, dynamic);

  /* not really essential since the program is about to exit anyway */
  free(dynamic);
} 

char* str_func(char* str)
{
  char* newstr = realloc(str, strlen(str) + 2);
  if (newstr) {
    strcat(newstr, "p");
    return newstr;
  } else {
    /* we failed to make str larger, but it is still there and should be freed */
    return str;
  }
}

Sua condição original não está totalmente correta: na verdade, o ponteiro passou para realloc

... deve ser previamente alocado por malloc(), calloc()ou realloc()e ainda não liberado com uma chamada para grátis ou realocar

[OU] Se ptr for NULL, o comportamento é o mesmo que chamar malloc(new_size).

paxdiablo Nov 25 2020 at 19:31

A reallocfunção funciona apenas com as coisas que foram originalmente criados com um pequeno grupo de funções de alocação (como malloc, callocou reallocem si), ou o ponteiro nulo. Como stringnão é nenhuma dessas coisas, seu código não está bem definido.