คำตอบหลายคำชี้ให้เห็น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
$
คุณจะสังเกตเห็นว่ามีปัญหาในตำแหน่งที่เรียก (ใน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ไฟล์. คำตอบของ Alex ด้านล่างปรากฏว่าถูกต้อง คำตอบของ Alex และใช้uintptr_tงานได้ทุกที่และเป็นมาตรฐานในขณะนี้ มันให้การรักษา C ++ 11 และยังให้ตัวป้องกันส่วนหัว C ++ 03