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 mallocquando 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 malloce 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, mallocs, frees 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 freepossível.
malloc()pode falhar!