( Leia este parágrafo antes de ler a publicação.Estou perguntando a qualquer pessoa interessada em ler este post que tente ler com atenção e, é claro, não diminua o voto até que você o entenda completamente, obrigado. )
Agora é um wiki da comunidade, portanto, se alguém discordar de algum dos conceitos, modifique-o, com uma explicação clara e detalhada do que está errado e por que, e se possível, cite fontes ou forneça provas que possam ser reproduzidas.
Responda
Aqui estão alguns outros motivos que podem ser os fatores subjacentes a NULL == 0
- O fato de que zero é falso, então pode-se fazer diretamente em
if(!my_ptr)
vez de if(my_ptr==NULL)
.
- O fato de números inteiros globais não iniciados serem inicializados por padrão para todos os zeros e, como tal, um ponteiro de todos os zeros seria considerado não inicializado.
Aqui eu gostaria de dizer uma palavra sobre outras respostas
Não por causa do açúcar sintático
Dizer que NULL é zero por causa do açúcar sintático, não faz muito sentido; se sim, por que não usar o índice 0 de uma matriz para manter seu comprimento?
De fato, C é a linguagem que mais se assemelha à implementação interna, faz sentido dizer que C escolheu zero apenas por causa do açúcar sintático? Eles preferem fornecer uma palavra-chave nula (como muitos outros idiomas) em vez de mapear zero para NULL!
Assim, a partir de hoje, pode ser apenas açúcar sintático, é claro que a intenção original dos desenvolvedores da linguagem C não era o açúcar sintático, como mostrarei mais adiante.
1) a especificação
No entanto, embora seja verdade que a especificação C fala da constante 0 como o ponteiro nulo (seção 6.3.2.3) e também define NULL a ser definido como implementação (seção 7.19 na especificação C11 e 7.17 na especificação C99), o permanece o fato de que, no livro "The C Programming Language", escrito pelos inventores de C, é indicado o seguinte na seção 5.4:
C garante que zero nunca é um endereço válido para dados, portanto, um valor de retorno zero pode ser usado para sinalizar um evento anormal, nesse caso, sem espaço.
Ponteiro e números inteiros não são intercambiáveis, Zero é a única exceção: o zero constante pode ser atribuído a um ponteiro e um ponteiro pode ser comparado com o zero constante. A constante simbólica NULL é frequentemente usada no lugar de zero, como um mnemônico para indicar mais claramente que esse é um valor especial para um ponteiro. NULL é definido em. A partir de agora, usaremos NULL.
Como se pode ver (pelas palavras "endereço zero") pelo menos a intenção original dos autores de C era o endereço zero, e não o zero constante, além disso, a partir deste trecho, parece que a razão pela qual a especificação fala do o zero constante provavelmente não deve excluir uma expressão avaliada como zero, mas incluir a constante inteira zero como a única constante inteira permitida para uso em um contexto de ponteiro sem conversão.
2) Resumo
Embora a especificação não diga explicitamente que um endereço zero pode ser tratado diferente da constante zero, ele não diz isso, e o fato de, ao lidar com a constante ponteiro nulo , não afirmar que sua implementação é definida como pela constante definida NULL , em vez disso, afirma que é zero, mostra que pode haver uma diferença entre a constante zero e o endereço zero.
(No entanto, se esse for o caso, eu me pergunto por que NULL é a implementação definida, pois, nesse caso, NULL também pode ser o zero constante, pois o compilador precisa converter todas as constantes de zero para a implementação real definida como NULL?)
No entanto, não vejo isso em ação real e, nas plataformas gerais, o endereço zero e o zero constante são tratados da mesma forma e lançam a mesma mensagem de erro.
Além disso, o fato é que os sistemas operacionais de hoje estão reservando a primeira página inteira (intervalo de 0x0000 a 0xFFFF), apenas para impedir o acesso ao endereço zero devido ao ponteiro NULL de C (consulte http://en.wikipedia.org/wiki/ Zero_page , bem como "Windows Via C / C ++ por Jeffrey Richter e Christophe Nasarre (publicado pela Microsoft Press)").
Assim, eu pediria a qualquer pessoa que afirmasse que ele realmente foi visto em ação, para especificar a plataforma, o compilador e o código exato que ele realmente criou (embora devido à definição vaga na especificação [como eu mostrei]) qualquer compilador e a plataforma é livre para fazer o que ele quiser).
No entanto, aparentemente, parece que os autores de C não tinham isso em mente, e estavam falando do "endereço zero", e que "C garante que nunca seja um endereço válido", assim como "NULL é apenas um mnemônico ", mostrando claramente que sua intenção original não era o" açúcar sintático ".
Não por causa do sistema operacional
Alegando também que o sistema operacional nega acesso ao endereço zero, por alguns motivos:
1) Quando C foi escrito, não havia essa restrição, como se pode ver nesta página da wiki http://en.wikipedia.org/wiki/Zero_page .
2) O fato é que os compiladores C acessaram o endereço de memória zero.
Este parece ser o fato do artigo a seguir da BellLabs ( http://www.cs.bell-labs.com/who/dmr/primevalC.html )
Os dois compiladores diferem nos detalhes em como eles lidam com isso. No anterior, o início é encontrado nomeando uma função; mais tarde, o início é simplesmente considerado 0. Isso indica que o primeiro compilador foi gravado antes de termos uma máquina com mapeamento de memória; portanto, a origem do programa não estava no local 0, enquanto que no momento do segundo, tivemos um PDP-11 que forneceu mapeamento.
(De fato, a partir de hoje (como citei as referências acima da wikipedia e da microsoft press), a razão para restringir o acesso ao endereço zero é por causa dos ponteiros NULL de C! Portanto, no final, acontece o contrário!)
3) Lembre-se de que C também é usado para escrever sistemas operacionais e até compiladores C!
De fato, o C foi desenvolvido com a finalidade de escrever o sistema operacional UNIX com ele e, como tal, parece não haver razão para que eles se restrinjam do endereço zero.
(Hardware) Explicação sobre como os computadores são (fisicamente) capazes de acessar o endereço zero
Há outro ponto que quero explicar aqui, como é possível fazer referência ao endereço zero?
Pense nisso por um segundo, os endereços são buscados pelo processador e, em seguida, enviados como voltagens no barramento de memória, que é usado pelo sistema de memória para chegar ao endereço real e, ainda assim, um endereço zero significa que não há voltagem. , então como o hardware físico do sistema de memória está acessando o endereço zero?
A resposta parece ser: esse endereço zero é o padrão e, em outras palavras, o endereço zero é sempre acessível pelo sistema de memória quando o barramento de memória está completamente desligado e, como tal, qualquer solicitação de leitura ou gravação sem especificar um endereço real (que é o caso do endereço zero) acessa automaticamente o endereço zero.
if (p != 0)
paraif (p)
qual idioma comum em C e C ++, embora tenha que abandonar o hábito se adotar o Java.