( পোস্ট পড়ার আগে দয়া করে এই অনুচ্ছেদটি পড়ুন।আমি এই পোস্টটি পড়তে আগ্রহী যে কাউকে জিজ্ঞাসা করছি এটি মনোযোগ সহকারে পড়ার চেষ্টা করা উচিত, এবং অবশ্যই আপনি এটি পুরোপুরি বুঝতে না পারলে এটিকে ডাউন করে দেবেন না, ধন্যবাদ। )
এটি এখন সম্প্রদায়ের উইকি, যেমন যদি কোনও ধারণার সাথে কেউ একমত না হয় তবে দয়া করে কী ভুল এবং কেন, তার স্পষ্ট ও বিস্তারিত ব্যাখ্যা সহ এটি সংশোধন করুন এবং যদি সম্ভব হয় তবে উত্সগুলি উদ্ধৃত করুন বা পুনরুত্পাদনযোগ্য প্রমাণ সরবরাহ করুন।
উত্তর
এখানে আরও কয়েকটি কারণ রয়েছে যা NULL == 0 এর অন্তর্নিহিত কারণ হতে পারে
- শূন্যটি মিথ্যা, এটির
if(!my_ptr)
পরিবর্তে সরাসরি কেউ এটি করতে পারে if(my_ptr==NULL)
।
- নির্বিঘ্নিত গ্লোবাল পূর্ণসংখ্যাগুলি সমস্ত শূন্যগুলিতে ডিফল্টরূপে আরম্ভ হয় এবং সমস্ত শূন্যের এই জাতীয় বিন্দুটিকে অবিচ্ছিন্ন বলে বিবেচনা করা হবে।
এখানে আমি অন্যান্য উত্তরগুলিতে একটি শব্দ বলতে চাই
সিনট্যাকটিক চিনির কারণে নয়
সিনট্যাকটিক চিনির কারণে NULL শূন্য বলে, খুব বেশি অর্থবোধ করে না, যদি তাই হয় তবে এটির দৈর্ঘ্য ধরে রাখতে কোন অ্যারের সূচক 0 ব্যবহার করবেন না কেন?
প্রকৃতপক্ষে সিটি এমন ভাষা যা অভ্যন্তরীণ বাস্তবায়নের সাথে সর্বাধিক সাদৃশ্যপূর্ণ, সেটির অর্থ কী বোঝায় যে সি কেবল সিনট্যাকটিক চিনির কারণে শূন্যকে বেছে নিয়েছে? তারা শূন্য ম্যাপিংয়ের পরিবর্তে নূরের মূল শব্দটি সরবরাহ করে (অনেকগুলি অন্যান্য ভাষায় করা হয়)!
আজকের হিসাবে এটি কেবল সিনট্যাকটিক চিনি হতে পারে, তবে এটি স্পষ্ট যে সি ভাষা বিকাশকারীদের মূল অভিপ্রায় সিনট্যাকটিক চিনির জন্য নয়, আমি আরও প্রদর্শন করব।
1) স্পেসিফিকেশন
তবুও এটি সত্য যে সি স্পেসিফিকেশন ধ্রুবক 0 থেকে নাল পয়েন্টার (বিভাগ 6.3.2.3) হিসাবে কথা বলে এবং NUL কে বাস্তবায়ন সংজ্ঞায়িত করার জন্য সংজ্ঞায়িত করে (C11 স্পেসিফিকেশনে বিভাগ 7.19, এবং C99 নির্দিষ্টকরণে 7.17), সত্যটি এখনও অব্যাহত রয়েছে যে সি এর উদ্ভাবকগণ দ্বারা রচিত "দ্য সি প্রোগ্রামিং ল্যাঙ্গুয়েজ" বইটিতে বিভাগের ৫.৪ অংশে বর্ণিত হয়েছে:
সি গ্যারান্টি দেয় যে শূন্য কখনই ডেটার জন্য বৈধ ঠিকানা নয়, সুতরাং শূন্যের ফেরতের মান কোনও অস্বাভাবিক ঘটনার সংকেত দিতে ব্যবহার করা যেতে পারে, এক্ষেত্রে কোনও স্থান নেই।
পয়েন্টার এবং পূর্ণসংখ্যাগুলি বিনিময়যোগ্য নয়, জিরো একমাত্র ব্যতিক্রম: একটি ধ্রুবক শূন্য একটি পয়েন্টারকে নির্ধারিত হতে পারে এবং একটি পয়েন্টারকে ধ্রুবক শূন্যের সাথে তুলনা করা যেতে পারে। প্রতীকী ধ্রুবক NULL প্রায়শই শূন্যের স্থলে ব্যবহৃত হয়, স্মৃতিচারণকারী হিসাবে এটি আরও নির্দিষ্ট করে বোঝাতে যে এটি একটি পয়েন্টারের জন্য একটি বিশেষ মান। NULL সংজ্ঞায়িত করা হয়। আমরা এখন থেকে NULL ব্যবহার করব।
যেহেতু কেউ দেখতে পাচ্ছেন ("শূন্য ঠিকানা" শব্দ থেকে) সি এর লেখকদের কমপক্ষে মূল উদ্দেশ্যটি শূন্যের ঠিকানাটি ছিল, এবং ধ্রুবক শূন্য নয়, তদুপরি এটি এই উদ্ধৃতি থেকে প্রতীয়মান হয় যে স্পেসিফিকেশনটি কারণ থেকে কথা বলে ধ্রুবক শূন্য সম্ভবত কোনও অভিব্যক্তি বাদ দেয় না যা শূন্যকে মূল্যায়ণ করে, কিন্তু পরিবর্তে বিন্যাস ছাড়াই পয়েন্টার প্রসঙ্গে ব্যবহারের জন্য অনুমোদিত একমাত্র পূর্ণসংখ্যার ধ্রুবক হিসাবে পূর্ণসংখ্যার ধ্রুবক শূন্যকে অন্তর্ভুক্ত করে।
2) সংক্ষিপ্তসার
যদিও স্পেসিফিকেশনটি স্পষ্টভাবে বলে না যে শূন্য ঠিকানাটি শূন্য ধ্রুবকের চেয়ে আলাদা হিসাবে বিবেচনা করা যেতে পারে, তবে এটি এমনটি বলে না এবং নাল পয়েন্টার ধ্রুবকের সাথে কাজ করার সময় এটি দাবি করে না যে এটি বাস্তবায়ন হিসাবে এটি নির্ধারণ করা হয়েছে বলে দাবি করা হয় না NULL সংজ্ঞায়িত ধ্রুবক দ্বারা করে , পরিবর্তে এটি শূন্য বলে দাবি করে, দেখায় যে শূন্য ধ্রুবক এবং শূন্য ঠিকানার মধ্যে পার্থক্য থাকতে পারে।
(তবে যদি এটি হয় তবে আমি কেবল আশ্চর্য হই যে কেন NUL বাস্তবায়ন সংজ্ঞায়িত করা হয়, যেহেতু যেমন একটি ক্ষেত্রে NULL স্থির শূন্যও হতে পারে, যেহেতু সংকলককে যাইহোক সমস্ত শূন্য ধ্রুবককে বাস্তব বাস্তবায়িত NUL তে রূপান্তর করতে হবে?)
তবে আমি এটি বাস্তব ক্রিয়ায় দেখতে পাচ্ছি না এবং সাধারণ প্ল্যাটফর্মে ঠিকানা শূন্য এবং ধ্রুবক শূন্যকে একইরূপে বিবেচনা করা হয় এবং একই ত্রুটি বার্তাটি ছুঁড়ে ফেলা হয়।
তদ্ব্যতীত সত্যটি হ'ল আজকের অপারেটিং সিস্টেমগুলি কেবল সি এর NULL পয়েন্টারের কারণে শূন্য ঠিকানায় অ্যাক্সেস রোধ করার জন্য পুরো প্রথম পৃষ্ঠাটি (0x0000 থেকে 0xFFFF পরিসীমা) সংরক্ষণ করছে, (দেখুন http://en.wikedia.org/wiki/ জিরো_পৃষ্ঠা , পাশাপাশি "জেফ্রি রিখর এবং ক্রিস্টোফ নাসারে (মাইক্রোসফ্ট প্রেস দ্বারা প্রকাশিত) উইন্ডোজ ভায়া সি / সি ++" "
সুতরাং আমি যে কারও কাছে দাবি করেছিলাম যে এটি বাস্তবে বাস্তবে দেখা গেছে, প্ল্যাটফর্মটি এবং সংকলক এবং তিনি যে সঠিক কোডটি করেছিলেন তা নির্দিষ্ট করে বলার জন্য (যদিও স্পেসিফিকেশনে অস্পষ্ট সংজ্ঞা থাকার কারণে [যেমন আমি দেখিয়েছি] যে কোনও সংকলক রয়েছে এবং প্ল্যাটফর্ম যা খুশি তাই করতে পারে)।
তবে এটিকে আপাতদৃষ্টিতে মনে হয় যে সি এর লেখকগণের মনে এটি ছিল না, এবং তারা "শূন্য ঠিকানা" বলছিলেন, এবং "সি গ্যারান্টি দেয় যে এটি কখনই একটি বৈধ ঠিকানা নয়", পাশাপাশি "NUL কেবল একটি স্মৃতিচারণকারী ", পরিষ্কারভাবে দেখায় যে এটির মূল উদ্দেশ্য" সিনট্যাকটিক চিনি "নয়।
অপারেটিং সিস্টেমের কারণে নয়
এছাড়াও দাবি করে যে অপারেটিং সিস্টেমটি কয়েকটি কারণে শূন্যের অ্যাক্সেসকে অস্বীকার করে:
1) সি লেখা হয়েছিল যখন এই উইকিপেজ http://en.wikedia.org/wiki/Zero_page এ দেখা যাবে হিসাবে এই জাতীয় কোনও বিধিনিষেধ ছিল না ।
2) আসল বিষয়টি হ'ল সি সংকলকগণ মেমরি ঠিকানা শূন্যে অ্যাক্সেস করেছিল।
বেল ল্যাবস ( http://www.cs.bell-labs.com/who/dmr/primevalC.html ) দ্বারা নিম্নলিখিত কাগজটি থেকে এটি সত্য বলে প্রতীয়মান হয়েছে
দুটি সংকলক তারা কীভাবে এটিকে মোকাবেলা করে তার বিশদে পৃথক। পূর্বের একটিতে, কোনও ক্রিয়াকলাপের নামকরণের মাধ্যমে সূচনাটি পাওয়া যায়; পরবর্তী সময়ে, শুরুটি কেবল 0 হিসাবে নেওয়া হয় This এটি ইঙ্গিত করে যে আমাদের মেমরি ম্যাপিং সহ একটি মেশিন রাখার আগে প্রথম সংকলকটি লেখা হয়েছিল, সুতরাং প্রোগ্রামটির উত্স 0 নম্বরে ছিল না, যখন দ্বিতীয়টির সময় পর্যন্ত, আমাদের একটি PDP-11 ছিল যা ম্যাপিং সরবরাহ করে।
(বাস্তবে আজকের হিসাবে (যেমন আমি উইকিপিডিয়া এবং মাইক্রোসফট প্রেস থেকে উপরের রেফারেন্সগুলি উদ্ধৃত করেছি), শূন্য ঠিকানায় অ্যাক্সেস সীমাবদ্ধ করার কারণটি সি এর ন্যূনাল পয়েন্টারগুলির কারণ! সুতরাং শেষে এটি অন্য উপায়ে দেখা যাচ্ছে!)
3) মনে রাখবেন যে সি অপারেটিং সিস্টেমগুলি লিখতেও ব্যবহৃত হয়, এমনকি সি সংকলকও!
প্রকৃতপক্ষে সিটি ইউএনআইএক্স অপারেটিং সিস্টেমটি এটির সাথে লেখার উদ্দেশ্যে তৈরি করা হয়েছিল এবং এ কারণেই এগুলি ঠিকানা শূন্য থেকে নিজেকে সীমাবদ্ধ রাখার কোনও কারণ বলে মনে হয় না।
(হার্ডওয়্যার) কম্পিউটার কীভাবে হয় তার ব্যাখ্যা (শারীরিকভাবে) ঠিকানা জিরো অ্যাক্সেস করতে সক্ষম
আমি এখানে আরও একটি বিষয় ব্যাখ্যা করতে চাই, ঠিক কীভাবে ঠিকানা শূন্যের উল্লেখ করা সম্ভব?
এক সেকেন্ডের জন্য এটি ভাবুন, ঠিকানাগুলি প্রসেসরের দ্বারা আনা হয় এবং তারপরে মেমোরি বাসে ভোল্টেজ হিসাবে প্রেরণ করা হয় যা মেমোরি সিস্টেম দ্বারা প্রকৃত ঠিকানায় পৌঁছানোর জন্য ব্যবহৃত হয়, এবং শূন্যের কোনও ঠিকানা বলতে কোনও ভোল্টেজের অর্থ হবে না সুতরাং, মেমরি সিস্টেমের শারীরিক হার্ডওয়্যারটি কীভাবে ঠিকানাটি অ্যাক্সেস করতে পারে?
উত্তরটি মনে হয়, সেই ঠিকানা শূন্যটি ডিফল্ট এবং অন্য কথায় ঠিকানা শূন্যটি মেমরি সিস্টেম দ্বারা সর্বদা অ্যাক্সেসযোগ্য থাকে যখন মেমরি বাসটি সম্পূর্ণভাবে বন্ধ থাকে এবং যেমন কোনও আসল ঠিকানা উল্লেখ না করে পড়ার বা লেখার অনুরোধ হিসাবে (যা কোন ঠিকানা শূন্যের ক্ষেত্রে) স্বয়ংক্রিয়ভাবে ঠিকানা শূন্যে অ্যাক্সেস করছে।
if (p != 0)
যেতে পারেনif (p)
, যদিও জাভা গ্রহণ করলে আপনাকে অভ্যাস থেকে বেরিয়ে আসতে হবে।