Một số câu trả lời đã chỉ ra uintptr_t
và #include <stdint.h>
là 'giải pháp'. Đó là, tôi đề nghị, một phần của câu trả lời, nhưng không phải là toàn bộ câu trả lời. Bạn cũng cần phải xem nơi hàm được gọi với ID thông báo của FOO.
Hãy xem xét mã này và biên dịch:
$ 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
$
Bạn sẽ quan sát thấy rằng có một vấn đề tại vị trí đang gọi (in main()
) - chuyển đổi một số nguyên thành một con trỏ mà không cần ép kiểu. Bạn sẽ cần phải phân tích function()
tất cả các cách sử dụng của mình để xem cách các giá trị được chuyển cho nó. Mã bên trong của tôi function()
sẽ hoạt động nếu các cuộc gọi được viết:
unsigned long i = 0x2341;
function(1, &i);
Vì của bạn có thể được viết khác, bạn cần xem lại các điểm mà hàm được gọi để đảm bảo rằng việc sử dụng giá trị như được hiển thị là hợp lý. Đừng quên, bạn có thể đang tìm thấy một lỗi tiềm ẩn.
Ngoài ra, nếu bạn định định dạng giá trị của void *
tham số (như đã được chuyển đổi), hãy xem xét kỹ <inttypes.h>
tiêu đề (thay vì stdint.h
- inttypes.h
cung cấp các dịch vụ của stdint.h
, điều này không bình thường, nhưng tiêu chuẩn C99 nói rằng [t] he header <inttypes.h>
bao gồm tiêu đề <stdint.h>
và mở rộng nó với các tiện ích bổ sung được cung cấp bởi các triển khai được lưu trữ ) và sử dụng macro PRIxxx trong chuỗi định dạng của bạn.
Ngoài ra, nhận xét của tôi hoàn toàn có thể áp dụng cho C chứ không phải C ++, nhưng mã của bạn nằm trong tập hợp con của C ++ có thể di chuyển giữa C và C ++. Cơ hội từ công bằng đến tốt mà nhận xét của tôi áp dụng.
size_t
việc không hoạt động là bộ nhớ phân đoạn i386. Mặc dù là máy 32 bit,sizeof
trả về2
chosize_t
. Alex câu trả lời dưới đây có vẻ đúng. Câu trả lời của Alex vàuintptr_t
hoạt động ở mọi nơi và tiêu chuẩn bây giờ của nó. Nó cung cấp một cách xử lý C ++ 11 và thậm chí nó còn cung cấp cho các bộ bảo vệ tiêu đề C ++ 03.