বেশ কিছু উত্তর দিকে তাক আছে uintptr_t
এবং #include <stdint.h>
'' সমাধান হিসেবে। তা হ'ল, আমি পরামর্শ দিয়েছি, উত্তরের একটি অংশ, তবে পুরো উত্তরটি নয়। আপনার এফওওর বার্তা আইডি সহ ফাংশনটি কোথায় ডাকা হয়েছে তাও আপনাকে দেখতে হবে।
এই কোড এবং সংকলন বিবেচনা করুন:
$ 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()
মানগুলি কীভাবে চলেছে তা দেখার জন্য আপনাকে তার সমস্ত ব্যবহারের ক্ষেত্রে আপনার বিশ্লেষণ করতে হবে need function()
কলগুলি লিখিত থাকলে আমার ভিতরে কোডটি কাজ করবে:
unsigned long i = 0x2341;
function(1, &i);
যেহেতু আপনার সম্ভবত অন্যরকম লেখা হয়েছে, আপনাকে ফাংশনটি যেখানে ডাকা হয়েছে সেই মানটি ব্যবহার করার জন্য এটি বোধগম্য হয় তা নিশ্চিত করে পর্যালোচনা করা উচিত need ভুলে যাবেন না, আপনি একটি সুপ্ত বাগ খুঁজে পেতে পারেন।
এছাড়াও, আপনি যদি void *
প্যারামিটারটির মান রূপান্তর করতে চলেছেন (রূপান্তরিত হিসাবে) তবে <inttypes.h>
শিরোনামটি সাবধানতার সাথে দেখুন (পরিবর্তে stdint.h
- inttypes.h
এর পরিষেবাগুলি সরবরাহ করে stdint.h
যা অস্বাভাবিক, তবে সি 99 স্ট্যান্ডার্ড বলছে [টি] তিনি শিরোনামটিতে <inttypes.h>
শিরোনাম <stdint.h>
এবং এটি হোস্টেড বাস্তবায়ন দ্বারা সরবরাহিত অতিরিক্ত সুবিধার সাথে প্রসারিত করে ) এবং আপনার ফর্ম্যাট স্ট্রিংগুলিতে পিআরআইএক্সএক্সএক্সএক্স ম্যাক্রোগুলি ব্যবহার করুন।
এছাড়াও, আমার মন্তব্যগুলি সি ++ এর পরিবর্তে সিটিতে কঠোরভাবে প্রযোজ্য, তবে আপনার কোডটি সি ++ এর সাবসেটে রয়েছে যা সি এবং সি ++ এর মধ্যে বহনযোগ্য। আমার মন্তব্যগুলি কার্যকর হওয়ার সম্ভাবনাগুলি ন্যায্য।
size_t
কাজ না করার একটি দৃ concrete় উদাহরণ হ'ল i386 খণ্ডিত মেমরি। যদিও একটি 32-বিট মেশিন, এর জন্যsizeof
ফিরে আসে । নীচে অ্যালেক্স উত্তর সঠিক প্রদর্শিত হবে। অ্যালেক্সের উত্তর এবং প্রায় সর্বত্র এবং এখনকার স্ট্যান্ডার্ডে কাজ করে। এটি একটি সি ++ 11 চিকিত্সা সরবরাহ করে এবং এটি সি ++ 03 শিরোনাম রক্ষীদেরও দেয়।2
size_t
uintptr_t