Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Pulse

Comparação ponteiro

Recommended Posts

Tava testando algumas possibilidades de comparações entre ponteiros para inteiros e variáveis inteiras. Sabendo que var é uma variável inteira e pvar um ponteiro para inteiros que aponta para var, um dos testes foi:

var == &pvar

 

Para a minha surpresa o código foi compilado, mas estou em dúvida porque ele foi compilado, já que var é uma variável inteira e pvar um ponteiro. Podemos fazer comparações entre tipos diferentes de variáveis? :unsure:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tenho certeza, mas no ISO C99 há o seguinte:

6.3.2.3 Pointers

 

5 An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.56)
6 Any pointer type may be converted to an integer type. Except as previously specified, the result is implementation-defined. If the result cannot be represented in the integer type,the behavior is undefined. The result need not be in the range of values of any integer type.


J.3 Implementation-defined behavior

-- The result of converting a pointer to an integer or vice versa (6.3.2.3)


Nesse caso, não sei se há uma conversão implícita entre os dois tipos definida pela implementação da linguagem pelo compilador ou se essa comparação foi marcada apenas como warning por questões de compatibilidade com código antigo.

Fui procurar na documentação do GCC, na parte de comportamento definido pela implementação e não vi aviso nenhum sobre isso: https://gcc.gnu.org/onlinedocs/gcc-4.8.4/gcc/Arrays-and-pointers-implementation.html#Arrays-and-pointers-implementation

Como a flag -Wno-int-to-pointer-cast não tem efeito (não desabilita essa verificação), suponho que o código compile por questões de compatilidade mesmo.

Sobre comparar tipos diferentes, não é tão simples assim. Na verdade quase nada é realmente simples em C. Veja isso:
https://www.securecoding.cert.org/confluence/display/c/INT36-C.+Converting+a+pointer+to+integer+or+integer+to+pointer

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.