คำตอบหลายคำชี้ให้เห็น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