Kilka odpowiedzi wskazywały na uintptr_ti #include <stdint.h>jako „” rozwiązania. To jest, jak sugeruję, część odpowiedzi, ale nie cała odpowiedź. Musisz również sprawdzić, gdzie wywoływana jest funkcja z identyfikatorem wiadomości FOO.
Rozważ ten kod i kompilację:
$ 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
$
Zauważysz, że występuje problem w miejscu wywołania (in main()) - konwersja liczby całkowitej na wskaźnik bez rzutowania. Będziesz musiał przeanalizować function()wszystkie jego zastosowania, aby zobaczyć, jak przekazywane są do niego wartości. Kod wewnątrz mojego function()działałby, gdyby wywołania były napisane:
unsigned long i = 0x2341;
function(1, &i);
Ponieważ twoje są prawdopodobnie napisane inaczej, musisz przejrzeć punkty, w których funkcja jest wywoływana, aby upewnić się, że ma sens użycie wartości, jak pokazano. Nie zapominaj, że możesz znaleźć ukryty błąd.
Ponadto, jeśli zamierzasz sformatować wartość void *parametru (jako przekonwertowaną), spójrz uważnie na <inttypes.h>nagłówek (zamiast stdint.h- inttypes.hzapewnia usługi stdint.h, co jest niezwykłe, ale standard C99 mówi, że [t] on nagłówek <inttypes.h>zawiera nagłówek <stdint.h>i rozszerza go o dodatkowe udogodnienia zapewniane przez hostowane implementacje ) i użyj makr PRIxxx w ciągach formatujących.
Ponadto moje komentarze odnoszą się ściśle do C, a nie C ++, ale Twój kod należy do podzbioru C ++, który jest przenośny między C i C ++. Są duże szanse, że moje uwagi będą miały zastosowanie.
size_tniedziałającej pamięci jest segmentowana pamięć i386. Chociaż jest to maszyna 32-bitowa,sizeofwraca2dosize_t. Odpowiedź Alex poniżej wydaje się poprawna. Odpowiedź Alexauintptr_tdziała prawie wszędzie i jest teraz standardem. Zapewnia obsługę C ++ 11, a nawet zapewnia ochronę nagłówka C ++ 03.