উত্তর:
থেকে বন্ধুত্বপূর্ণ উইকিপিডিয়া :
Stdlib.h এবং stddef.h হেডার ফাইল ডাটাটাইপ নামক সংজ্ঞায়িত size_t যা একটি বস্তুর আকার প্রতিনিধিত্ব করতে ব্যবহৃত হয়। আকার ধারণ করে এমন লাইব্রেরির ফাংশনগুলি তাদের আকার_ tt টাইপ হওয়ার প্রত্যাশা করে এবং আকারের অপারেটর আকার_t এ মূল্যায়ন করে।
প্রকৃত ধরণের আকার_টি প্ল্যাটফর্ম-নির্ভর; একটি সাধারণ ভুল হ'ল আকার_t হ'ল স্বাক্ষরযুক্ত স্বাক্ষর হিসাবে একই, যা প্রোগ্রামিং ত্রুটির দিকে পরিচালিত করতে পারে, বিশেষত 64৪-বিট আর্কিটেকচার আরও প্রচলিত হয়ে ওঠে বলে।
এছাড়াও, কেন আকার_ত গুরুত্বপূর্ণ তা পরীক্ষা করে দেখুন
/usr/include/stdlib.h
সংজ্ঞাটি পেয়েছে /usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h
এবং এর মধ্যে এটি ডিফল্ট হয় long unsigned int
যদি না অন্য কোনও হেডার ফাইল অন্যথায় না বলে।
আকার_t হ'ল প্রকার যা আকারগুলির প্রতিনিধিত্ব করতে ব্যবহৃত হয় (যেমন এর নামগুলি বোঝায়)। এটির প্ল্যাটফর্ম (এবং এমনকি সম্ভাব্য বাস্তবায়ন) নির্ভর করে এবং কেবল এই উদ্দেশ্যে ব্যবহার করা উচিত। স্পষ্টতই, একটি আকার, আকার_t প্রতিনিধিত্ব স্বাক্ষরযুক্ত নয়। Malloc, আকার এবং বিভিন্ন স্ট্রিং অপারেশন ফাংশন সহ অনেক স্টডিলিব ফাংশন সাইজ_টাকে ডেটাটাইপ হিসাবে ব্যবহার করে।
কোনও পূর্বনির্ধারিত দ্বারা একটি স্বাক্ষরিত হয়, এবং এর আকারও প্ল্যাটফর্ম নির্ভর, যদিও এটি বেশিরভাগ আধুনিক মেশিনে একটি নির্দিষ্ট 32 বিট হবে (এবং যদিও আকার_টি 64৪-বিট আর্কিটেকচারে b৪ বিট হয় তবে those স্থাপত্যগুলিতে bits২ বিট দীর্ঘ থাকবে)।
সংক্ষিপ্তসার হিসাবে: কোনও ক্ষেত্রে কোনও অবজেক্টের আকার এবং ইন্ট (বা দীর্ঘ) এর আকার উপস্থাপন করতে আকার_ টি ব্যবহার করুন।
size_t
ধরনের স্বাক্ষরবিহীন অবিচ্ছেদ্য টাইপ হিসাবে সংজ্ঞায়িত করা হয় sizeof
অপারেটর। বাস্তব বিশ্বে আপনি প্রায়শই int
32 বিট হিসাবে সংজ্ঞায়িত দেখতে পাবেন (পশ্চাদগম্য সামঞ্জস্যের জন্য) তবে size_t
64 বিট হিসাবে সংজ্ঞায়িত (যাতে আপনি 4 বিবি প্ল্যাটফর্মের আকারে 4 GiB এর চেয়ে বেশি অ্যারে এবং কাঠামো ঘোষণা করতে পারেন)। যদি long int
একটিও -৪-বিট হয় তবে এটিকে LP64 কনভেনশন বলা হয়; যদি long int
32 বিট হয় তবে long long int
এবং পয়েন্টারগুলি 64 বিট হয়, এটি এলএলপি 64। আপনি বিপরীতটিও পেতে পারেন, এমন একটি প্রোগ্রাম যা গতির জন্য -৪-বিট নির্দেশিকা ব্যবহার করে, তবে মেমরি সংরক্ষণ করতে 32-বিট পয়েন্টার। এছাড়াও, int
স্বাক্ষরিত এবং size_t
স্বাক্ষরবিহীন।
Historতিহাসিকভাবে এমন অনেকগুলি প্ল্যাটফর্ম ছিল যেখানে ঠিকানাগুলি দেশীয় আকারের চেয়ে প্রশস্ত বা খাটো ছিল int
। প্রকৃতপক্ষে, '70s এবং 80 এর দশকের প্রথমদিকে, এটি না হওয়ার চেয়ে বেশি সাধারণ ছিল: সমস্ত জনপ্রিয় 8-বিট মাইক্রো কম্পিউটারে 8-বিট রেজিস্টার এবং 16-বিট অ্যাড্রেস ছিল এবং 16 এবং 32 বিটের মধ্যে রূপান্তরও অনেকগুলি মেশিন তৈরি করেছিল যা তাদের রেজিস্টারগুলির চেয়ে আরও বিস্তৃত ঠিকানা ছিল। আমি মাঝে মাঝে এমএস-ডস-এর বোরল্যান্ড টার্বো সি সম্পর্কে প্রশ্নগুলি দেখতে পাই, যার বিশাল মেমরি মোডে একটি 16 বিট সিপিইউতে 32 বিটের মধ্যে 20-বিট ঠিকানা সঞ্চিত ছিল (তবে এটি 80386-এর 32-বিট নির্দেশিকা সেটকে সমর্থন করতে পারে); মোটোরোলা 68000-এ 32-বিট রেজিস্টার এবং ঠিকানা সহ 16-বিট ALU ছিল; 15-বিট, 24-বিট বা 31-বিট অ্যাড্রেস সহ আইবিএম মেইনফ্রেমগুলি ছিল। আপনি এম্বেড থাকা সিস্টেমে এখনও বিভিন্ন ALU এবং ঠিকানা-বাস মাপ দেখতে পাচ্ছেন।
যে কোনও সময় এর int
চেয়ে ছোট হয় size_t
এবং আপনি একটি খুব বড় ফাইল বা অবজেক্টের আকার বা অফসেট একটিতে সংরক্ষণ করার চেষ্টা unsigned int
করেন, সম্ভাবনা রয়েছে যে এটি উপচে পড়তে পারে এবং একটি বাগ তৈরি করতে পারে। একটি সঙ্গে int
, aণাত্মক নম্বর পাওয়ার সম্ভাবনাও রয়েছে। যদি int
বা আরও unsigned int
বৃহত্তর হয় তবে প্রোগ্রামটি সঠিকভাবে চলবে তবে মেমরির অপচয় করবে।
আপনি বহনযোগ্যতা চাইলে আপনার প্রয়োজনটির জন্য সাধারণত সঠিক ধরণটি ব্যবহার করা উচিত। অনেক লোক আপনাকে স্বাক্ষরবিহীন পরিবর্তে স্বাক্ষরিত গণিত ব্যবহার করার পরামর্শ দেয় (ন্যাংটো, সূক্ষ্ম বাগগুলি পছন্দ করতে 1U < -3
)। যে উদ্দেশ্যে, মানক গ্রন্থাগার সংজ্ঞায়িত ptrdiff_t
মধ্যে <stddef.h>
আরেকটি থেকে একটি পয়েন্টার বিয়োগ ফল স্বাক্ষরিত টাইপ হিসাবে।
তাই বলা হয়, বিরুদ্ধে সব ঠিকানা ও অফসেট সীমা চেক করার জন্য একটি কার্যসংক্রান্ত হতে পারে INT_MAX
এবং হয় 0
বা INT_MIN
যথাযথ হিসাবে, এবং কম্পাইলার এবং কেস সম্পর্কে স্বাক্ষরিত তুলনা সতর্কবার্তা স্বাক্ষরবিহীন পরিমাণে যদি আপনি কোন মিস্ চালু করুন। আপনার সর্বদা, সর্বদা, সর্বদা যাইহোক সি তে ওভারফ্লো করার জন্য আপনার অ্যারে অ্যাক্সেসগুলি চেক করা উচিত।
এর কারণ সাইজ_টি ইন্ট (সম্ভবত কোনও স্ট্রাক্ট) ব্যতীত অন্য কিছু হতে পারে। ধারণাটি হ'ল এটি অন্তর্নিহিত ধরণের থেকে এটির কাজটি ডিকপল করে।
size_t
স্বাক্ষরবিহীন পূর্ণসংখ্যা টাইপ হিসাবে নির্দিষ্ট করা হয় । C11 §6.5.3.4 5 "উভয় অপারেটরের ( sizeof
_Alignof
) এর ফলাফলের মান বাস্তবায়ন-সংজ্ঞায়িত এবং এর ধরণ (স্বাক্ষরবিহীন পূর্ণসংখ্যার প্রকার) size_t
,"।
এর সংজ্ঞাটি SIZE_T
পাওয়া যায়:
https://msdn.microsoft.com/en-us/library/cc441980.aspx এবং https://msdn.microsoft.com/en-us/library/cc230394.aspx
এখানে প্রয়োজনীয় তথ্য আটকানো:
SIZE_T
এটি একটি ULONG_PTR
সর্বাধিক সংখ্যক বাইটের প্রতিনিধিত্ব করে যেখানে পয়েন্টারটি নির্দেশ করতে পারে।
এই ধরণের নিম্নলিখিত হিসাবে ঘোষণা করা হয়:
typedef ULONG_PTR SIZE_T;
এ ULONG_PTR
হ'ল স্বাক্ষরযুক্ত দীর্ঘ প্রকার যা পয়েন্টার যথার্থতার জন্য ব্যবহৃত হয়। এটি পয়েন্টার পাটিগণিত সম্পাদন করার জন্য একটি দীর্ঘ টাইপে পয়েন্টার ingালাইয়ের সময় ব্যবহৃত হয়।
এই ধরণের নিম্নলিখিত হিসাবে ঘোষণা করা হয়:
typedef unsigned __int3264 ULONG_PTR;
SIZE_T
না size_t
, ওপি যা চেয়েছিল তা নয় ।
SIZE_T
থেকে সম্পূর্ণ আলাদা size_t
। আপনি টাইপের একটি ভেরিয়েবল ঘোষণা করতে পারবেন না SIZE_T
।