সি স্ট্যান্ডার্ড গ্যারান্টি দেয় যে এটি size_t
এমন এক ধরণের যা কোনও অ্যারে সূচক ধরে রাখতে পারে। এর অর্থ হ'ল, যৌক্তিকভাবে size_t
কোনও পয়েন্টার টাইপ ধরে রাখতে সক্ষম হওয়া উচিত। আমি কিছু সাইটগুলিতে পড়েছি যা আমি গুগলে দেখেছি যে এটি আইনী এবং / অথবা সর্বদা কাজ করা উচিত:
void *v = malloc(10);
size_t s = (size_t) v;
সুতরাং C99 এ, স্ট্যান্ডার্ডটি প্রকারগুলি intptr_t
এবং uintptr_t
প্রকারগুলি প্রবর্তন করে , যা স্বাক্ষরিত এবং স্বাক্ষরযুক্ত প্রকারগুলি পয়েন্টারগুলি ধরে রাখতে সক্ষম হওয়ার গ্যারান্টিযুক্ত:
uintptr_t p = (size_t) v;
সুতরাং ব্যবহার size_t
এবং এর মধ্যে পার্থক্য কি uintptr_t
? উভয় স্বাক্ষরযুক্ত, এবং উভয়ই যে কোনও পয়েন্টার টাইপ ধরে রাখতে সক্ষম হওয়া উচিত, তাই তারা কার্যত অভিন্ন বলে মনে হয়। স্পষ্টতা বাদে অন্যটি ব্যবহার করার পরিবর্তে uintptr_t
(বা আরও ভাল, ক void *
) ব্যবহার করার কোনও বাস্তব জোরালো কারণ আছে size_t
? একটি অস্বচ্ছ কাঠামোতে, যেখানে ক্ষেত্রটি কেবলমাত্র অভ্যন্তরীণ ফাংশন দ্বারা পরিচালিত হবে, সেখানে এটি না করার কোনও কারণ আছে কি?
একই টোকেন ptrdiff_t
দ্বারা, একটি স্বাক্ষরিত টাইপ পয়েন্টার পার্থক্য ধরে রাখতে সক্ষম হয়েছে, এবং তাই কোনও কোনও পয়েন্টার ধরে রাখতে সক্ষম, সুতরাং এটি কীভাবে পৃথক intptr_t
?
এই ধরণের সমস্তগুলি কি মূলত একই ফাংশনের তুচ্ছ বিভিন্ন সংস্করণ পরিবেশন করে না? তা না হলে কেন? আমি তাদের একজনের সাথে কী করতে পারি না যা আমি অন্যের সাথে করতে পারি না? যদি তা হয় তবে কেন C99 ভাষাটিতে দুটি মূলত অতিশয় প্রকার যুক্ত করেছে?
আমি ফাংশন পয়েন্টারগুলিকে উপেক্ষা করতে ইচ্ছুক, কারণ তারা বর্তমান সমস্যার ক্ষেত্রে প্রযোজ্য নয়, তবে এগুলি উল্লেখ করতে নির্দ্বিধায় আমার মনে হয়, কারণ আমার মনে সন্দেহজনক ধারণা রয়েছে যে তারা "সঠিক" উত্তরের কেন্দ্রে থাকবে।
size_t
এবংuintptr_t
তবে কীptrdiff_t
এবংintptr_t
- এই দু'টিই কি কোনও প্ল্যাটফর্মে একই পরিসরের মানগুলি সংরক্ষণ করতে সক্ষম হবে না? কেন উভয় স্বাক্ষরযুক্ত এবং স্বাক্ষরবিহীন পয়েন্টার আকারের পূর্ণসংখ্যার ধরণের, বিশেষত যদিptrdiff_t
ইতিমধ্যে স্বাক্ষরিত পয়েন্টার-আকারের পূর্ণসংখ্যার প্রকারের উদ্দেশ্যে পরিপূর্ণ হয়।