Como usar realloc em C [duplicado]
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
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: realloc
nã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 realloc
um ponteiro que foi passado anteriormente malloc
ou um ponteiro nulo. É assim que essas funções funcionam.
Para obter detalhes, consulte O que é alocado na pilha e no heap? .
Eu vi que você precisa usar malloc antes, mas não entendo se você DEVE usá-lo
Se você precisa usar malloc
antes de fazer realloc
algo, então, por definição, você deve apenas realloc
coisas 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 malloc
e 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()
ourealloc()
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)
.
A realloc
função funciona apenas com as coisas que foram originalmente criados com um pequeno grupo de funções de alocação (como malloc
, calloc
ou realloc
em si), ou o ponteiro nulo. Como string
não é nenhuma dessas coisas, seu código não está bem definido.