Se você não sabe o tamanho exato da memória que precisa usar, você precisa de alocação dinâmica ( malloc
). Um exemplo pode ser quando um usuário abre um arquivo em seu aplicativo. Você vai precisar ler o conteúdo do arquivo na memória, mas é claro que você não sabe o tamanho do arquivo com antecedência, já que o usuário seleciona o arquivo no local, em tempo de execução. Então, basicamente, você precisa malloc
quando não sabe o tamanho dos dados com os quais está trabalhando com antecedência. Pelo menos esse é um dos principais motivos de uso malloc
. Em seu exemplo com uma string simples que você já sabe o tamanho em tempo de compilação (mais você não quer modificá-la), não faz muito sentido alocá-la dinamicamente.
Um pouco fora do assunto, mas ... você tem que ter muito cuidado para não criar vazamentos de memória ao usar malloc
. Considere este código:
int do_something() {
uint8_t* someMemory = (uint8_t*)malloc(1024);
// Do some stuff
if ( /* some error occured */ ) return -1;
// Do some other stuff
free(someMemory);
return result;
}
Você vê o que há de errado com este código? Há uma declaração de retorno condicional entre malloc
e free
. Pode parecer bom no início, mas pense nisso. Se houver um erro, você retornará sem liberar a memória alocada. Esta é uma fonte comum de vazamentos de memória.
É claro que este é um exemplo muito simples e é muito fácil ver o erro aqui, mas imagine centenas de linhas de código repletas de ponteiros, malloc
s, free
s e todos os tipos de tratamento de erros. As coisas podem ficar complicadas muito rápido. Esta é uma das razões pelas quais prefiro C ++ moderno em vez de C em casos aplicáveis, mas esse é um outro tópico.
Portanto, sempre que usar malloc
, certifique-se de que sua memória seja o mais provável free
possível.
malloc()
pode falhar!