कई उत्तरों ने 'समाधान' के रूप में 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
। नीचे एलेक्स का उत्तर सही प्रतीत होता है। एलेक्स का जवाब औरuintptr_t
हर जगह और उसके अब मानक के बारे में काम करता है। यह C ++ 11 उपचार प्रदान करता है, और यह C ++ 03 हेडर गार्ड भी देता है।