Pergunta

Como posso obter o endereço de memória do valor que um ponteiro aponta? No meu caso, é um ponteiro vazio. Apenas atribuí -lo a um UINT me dá esse erro:

Error   1   error C2440: 'return' : cannot convert from 'void *' to 'UInt32'

obrigado!

Foi útil?

Solução

std::size_t address = reinterpret_cast<std::size_t>(voidptr);
// sizeof(size_t) must be greater or equal to sizeof(void*)
// for the above line to work correctly.

@Paul hsieh
Eu acho que é suficiente converter void* para size_t Nesta pergunta específica por três razões:

  • O questionador não especificou se ele deseja uma solução portátil ou não. Ele disse que funcionou com ele. Não sei exatamente o que isso significa, mas está claro para mim que ele está trabalhando no IA-32 no Windows ou em outro sistema no modo protegido. Isso significa converter um ponteiro em um número inteiro, é uma operação definida nesse sistema, mesmo que não seja definido pelo C ++ padrão.

  • Segundo, propus primeiro converter o ponteiro para int o que é claramente sem sentido como litb e Jalf mostrou-me. Eu corrigi o erro que cometi e substituí int com size_t.

  • Finalmente, tentei encontrar algo relevante para o que você propôs como uma solução nos padrões. Infelizmente, não consegui encontrar nada relevante. Eu tenho esta referência: ANSI ISO IEC 14882 2003. Eu acho que Sellibitze apontou que vai Faça parte dos próximos padrões. Eu realmente não sei sobre C e, obviamente, o C99 introduziu esta solução perfeita. Eu gostaria que alguém me mostrasse uma solução portátil no C ++.

Por favor, não hesite em corrigir meus erros, ainda sou estudante da Uni :)

Obrigado,

Outras dicas

Um ponteiro, em C e C ++ é A modalidade de um endereço de memória em alguma forma abstrata. Você pode obter uma interpretação de string específica de implementação de um ponteiro como:

printf ("%p", voidPointer);

Outra maneira é lançá -lo para intptr_t:

(intptr_t) voidPointer;

O ponteiro nulo em C ++ é definido como igual a "0"; portanto, presumivelmente você obteria o equiavlent de (intptr_t) 0 na operação acima. No entanto, ainda depende de você e de qualquer conhecimento específico da implementação que você precise interpretar isso como um endereço de memória.

O ponto é que, em plataformas que usam modelos de memória bizarra, como compiladores de 16 bits x86 DOS, que têm segmentos com compensações como modelo de memória, os ponteiros podem ser interpretados de várias maneiras. Em uma representação de endereço bruto, o nulo pode ser DS: 0 ou SS: 0 em vez de apenas uma planície 0.

Você precisa de um elenco - seja um reinterpret_cast (preferível):

UInt32 address = reinterpret_cast<UInt32>( voidPointer );

ou um elenco de estilo C (realmente não recomendado):

UInt32 address = (UInt32)voidPointer;

Você pode obter uma representação de string do endereço com sprintf () ou exibi -lo com printf () usando o especificador de formato %p, por exemplo:

printf( "%p", voidptr ) ;

Se você deseja apenas o endereço para executar a aritmética do ponteiro, ele a peça para um ponteiro de tipo de dados concreto apropriado, caso contrário, o peça para um número inteiro, como já sugerido.

Em C ++, pude imprimir o endereço apontado com:

cout << "Address: " << ((unsigned)my_ptr);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top