Agora, antes que as pessoas comecem a marcar isso como um duplicado, li tudo o que se segue, nenhum deles fornece a resposta que procuro:
- C FAQ: O que há de errado em lançar o valor de retorno de malloc?
- SO: Devo converter explicitamente o valor de retorno de malloc ()?
- SO: Ponteiros desnecessários em C
- SO: Eu lanço o resultado de malloc?
Tanto o C FAQ quanto muitas respostas às perguntas acima citam um erro misterioso que malloc
o valor de retorno do casting pode ocultar; entretanto, nenhum deles dá um exemplo específico de tal erro na prática. Agora preste atenção que eu disse erro , não aviso .
Agora com o seguinte código:
#include <string.h>
#include <stdio.h>
// #include <stdlib.h>
int main(int argc, char** argv) {
char * p = /*(char*)*/malloc(10);
strcpy(p, "hello");
printf("%s\n", p);
return 0;
}
Compilar o código acima com gcc 4.2, com e sem o elenco, dá os mesmos avisos, e o programa é executado corretamente e fornece os mesmos resultados em ambos os casos.
anon@anon:~/$ gcc -Wextra nostdlib_malloc.c -o nostdlib_malloc
nostdlib_malloc.c: In function ‘main’:
nostdlib_malloc.c:7: warning: incompatible implicit declaration of built-in function ‘malloc’
anon@anon:~/$ ./nostdlib_malloc
hello
Então, alguém pode dar um exemplo de código específico de um erro de compilação ou tempo de execução que pode ocorrer por causa do malloc
valor de retorno do casting , ou isso é apenas uma lenda urbana?
Editar Eu encontrei dois argumentos bem escritos sobre este assunto:
- A favor do Casting: CERT Advisory: Converta imediatamente o resultado de uma chamada de função de alocação de memória em um ponteiro para o tipo alocado
- Contra a transmissão (erro 404 de 14/02/2012: use a cópia do Internet Archive Wayback Machine de 27/01/2010. {18/03/2016: "A página não pode ser rastreada ou exibida devido ao robots.txt."})
void
ponteiros permite compilar o código como C ++; algumas pessoas dizem que é um recurso, eu diria que é um bug;)