Кілька відповідей вказали на рішення uintptr_t
і #include <stdint.h>
як на "рішення". Тобто, я пропоную, частина відповіді, але не ціла відповідь. Вам також потрібно подивитися, куди викликана функція, з ідентифікатором повідомлення FOO.
Розглянемо цей код та компіляцію:
$ 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
$
Ви помітите, що існує проблема у місці виклику (in main()
) - перетворенні цілого числа у покажчик без приведення. Вам потрібно буде проаналізувати свій спосіб використання function()
у всіх його звичаях, щоб побачити, як йому передаються цінності. Код всередині мого function()
працював би, якби дзвінки були написані:
unsigned long i = 0x2341;
function(1, &i);
Оскільки ваші, ймовірно, написані інакше, вам потрібно переглянути пункти, де викликається функція, щоб переконатися, що має сенс використовувати значення, як показано. Не забувайте, можливо, ви знаходите приховану помилку.
Крім того, якщо ви збираєтеся відформатувати значення void *
параметра (як перетворене), уважно подивіться на <inttypes.h>
заголовок (замість stdint.h
- inttypes.h
надає послуги stdint.h
, що незвично, але стандарт C99 говорить [t], що заголовок <inttypes.h>
включає заголовок <stdint.h>
і розширює його додатковими можливостями, що надаються розміщеними реалізаціями ) і використовуйте макроси PRIxxx у рядках вашого формату.
Крім того, мої коментарі суворо застосовуються до C, а не до C ++, але ваш код знаходиться в підмножині C ++, що переноситься між C і C ++. Шанси справедливі і добрі, що застосовуються мої коментарі.
size_t
непрацюючої є сегментована пам'ять i386. Хоча 32-розрядна машина,sizeof
повертається2
заsize_t
. Відповідь Алекса нижче виглядає правильно. Відповідь Алексаuintptr_t
працює майже скрізь, і це зараз є стандартним. Він забезпечує обробку C ++ 11 і навіть захищає заголовки C ++ 03.