Pulse 0 Denunciar post Postado Junho 8, 2015 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
_Isis_ 202 Denunciar post Postado Junho 12, 2015 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-implementationComo 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
guidjos 65 Denunciar post Postado Junho 14, 2015 Sugiro que use uintptr_t, se estiver disponível na sua implementação. Compartilhar este post Link para o post Compartilhar em outros sites