Varias respuestas han señalado uintptr_t
y #include <stdint.h>
como "la" solución. Eso es, sugiero, parte de la respuesta, pero no toda la respuesta. También debe observar dónde se llama a la función con el ID de mensaje de FOO.
Considere este código y compilación:
$ cat kk.c
#include <stdio.h>
static void function(int n, void *p)
{
unsigned long z = *(unsigned long *)p;
printf("%d - %lu\n", n, z);
}
int main(void)
{
function(1, 2);
return(0);
}
$ rmk kk
gcc -m64 -g -O -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith \
-Wcast-qual -Wstrict-prototypes -Wmissing-prototypes \
-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE kk.c -o kk
kk.c: In function 'main':
kk.c:10: warning: passing argument 2 of 'func' makes pointer from integer without a cast
$
Observará que hay un problema en la ubicación de la llamada (en main()
): convertir un entero en un puntero sin conversión. Vas a necesitar analizar tu function()
en todos sus usos para ver cómo se le pasan los valores. El código dentro de mi function()
funcionaría si las llamadas estuvieran escritas:
unsigned long i = 0x2341;
function(1, &i);
Dado que el suyo probablemente esté escrito de manera diferente, debe revisar los puntos donde se llama a la función para asegurarse de que tenga sentido usar el valor como se muestra. No lo olvide, puede estar encontrando un error latente.
Además, si va a formatear el valor del void *
parámetro (como convertido), mire detenidamente el <inttypes.h>
encabezado (en lugar de stdint.h
- inttypes.h
proporciona los servicios de stdint.h
, lo cual es inusual, pero el estándar C99 dice que [t] el encabezado <inttypes.h>
incluye el encabezado <stdint.h>
y lo extiende con facilidades adicionales proporcionadas por implementaciones alojadas ) y use las macros PRIxxx en sus cadenas de formato.
Además, mis comentarios son estrictamente aplicables a C en lugar de C ++, pero su código está en el subconjunto de C ++ que es portátil entre C y C ++. Las posibilidades de que se apliquen mis comentarios son justas a buenas.
size_t
no funciona es la memoria segmentada i386. Aunque una máquina de 32 bits,sizeof
devuelve2
asize_t
. La respuesta de Alex a continuación parece correcta. Alex responde yuintptr_t
funciona en casi todas partes y ahora es estándar. Proporciona un tratamiento de C ++ 11 e incluso proporciona protecciones de encabezado de C ++ 03.