Pregunta

¿Cómo puedo obtener la dirección de memoria del valor de un puntero apunta a? en mi caso, es un puntero nulo. acaba de asignar a un uint me da este error:

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

Gracias!

¿Fue útil?

Solución

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.

@ Pablo Hsieh
Creo que es suficiente para convertir a void* size_t en esta cuestión específica, por tres razones:

  • El interrogador no especificó si él quiere una solución portátil o no. Él dijo, que trabajó con él. No sé exactamente lo eso significa, pero es claro para mí que es trabajando en IA-32 en Windows u otro sistema en modo protegido. Ese medios de conversión un puntero a una número entero es una operación definida en que el sistema incluso si no se define por C ++ estándar.

  • En segundo lugar, he propuesto convirtiendo en primer lugar el puntero para int que es claramente poco sentido como litb y JALF me mostró. He corregido el error que he hecho, y lo reemplazó con int size_t.

  • Finalmente, probé mi difícil encontrar algo relevante para lo que propone como una solución en las normas. Por desgracia, no pude encontrar nada relevante. Tengo esta referencia: ANSI ISO IEC 14882 2003 . Creo sellibitze señaló que ser parte de los próximos estándares. Realmente no sé de C, y obviamente C99 introdujo esta solución perfecta. Me gustaría que alguien me muestre una solución portátil en C ++.

Por favor, no dude en corregir mis errores, soy todavía un estudiante en la universidad:)

Gracias,

Otros consejos

Un puntero, en C y C ++ es la forma de realización de una dirección de memoria en alguna forma abstracta. Usted puede obtener una interpretación cadena específica implementación de un puntero como:

printf ("%p", voidPointer);

Otra forma es echarlo a intptr_t:

(intptr_t) voidPointer;

El puntero NULL en C ++ se define como igual a "0", por lo que presumiblemente se podrían obtener la equiavlent de (intptr_t) 0 en la operación anterior. Sin embargo, todavía depende de usted y de cualquier conocimiento específico de la aplicación hay que interpretarlo como una dirección de memoria.

El punto es que en las plataformas que utilizan modelos de memoria extrañas tales como compiladores x86 DOS 16 bits, que tienen segmentos con desplazamientos como su modelo de memoria, los punteros pueden ser interpretados de muchas maneras. En un discurso en bruto NULL representación podría ser DS: 0 ó SS: 0 en lugar de sólo una llanura 0.

Es necesario un reparto - ya sea un reinterpret_cast (preferible):

UInt32 address = reinterpret_cast<UInt32>( voidPointer );

o una conversión de estilo C (realmente no se recomienda):

UInt32 address = (UInt32)voidPointer;

Se puede obtener una representación de cadena de la dirección con sprintf () o mostrarlo con printf () con el especificador de formato% p, por ejemplo:

printf( "%p", voidptr ) ;

Si lo que desea es la dirección para llevar a cabo la aritmética de punteros en, echarlo a un puntero de tipo de datos de cemento correspondiente, de lo contrario echarlo a un entero como ya se ha sugerido.

En C ++ I fue capaz de imprimir la dirección de puntas con:

cout << "Address: " << ((unsigned)my_ptr);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top