0x0 অবস্থানের দিকে নির্দেশকারী একটি পয়েন্টার এবং NULL তে একটি পয়েন্টার সেট করার মধ্যে পার্থক্য কী?


12

একটি পয়েন্টার 0x0000 পয়েন্টারটি কি একইভাবে NUL তে সেট করা পয়েন্টার হিসাবে সমান? সিউলে যদি NULL মানটি সংজ্ঞায়িত করা হয়, তবে এটি শারীরিকভাবে কোন স্থানে অনুবাদ করে? এটি কি 0x0000 এর মতো? আমি এই ধারণাগুলি সম্পর্কে আরও বিশদ কোথায় পেতে পারি?


1
এটি ইতিমধ্যে স্ট্যাক ওভারফ্লো - স্ট্যাকওভারফ্লো . com / প্রশ্নগুলি / 1296843/ … জিজ্ঞাসা করা হয়েছে । আমি মনে করি এটি আমাদের জন্য সীমান্তরেখা, তবে আমি মুহূর্তের জন্য সন্দেহের উপকারটি দিতে ইচ্ছুক।
ChrisF

উত্তর:


12

একটি বিন্দু যা এখানে বেশিরভাগ উত্তরগুলি সম্বোধন করছে না, কমপক্ষে স্পষ্টভাবে নয়, তা হ'ল নাল পয়েন্টারটি এমন একটি মান যা কার্যকর করার সময় বিদ্যমান, এবং একটি নাল পয়েন্টার ধ্রুবক একটি সিনট্যাকটিক গঠন যা সি উত্স কোডে বিদ্যমান।

একটি নাল পয়েন্টার ধ্রুবক , যেমন কার্লসনের উত্তর সঠিকভাবে বলেছে, হয় মান 0 (একটি 0সাধারণ সর্বাধিক সাধারণ উদাহরণ) সহ একটি পূর্ণসংখ্যক ধ্রুবক অভিব্যক্তি , বা এ জাতীয় অভিব্যক্তি void*(যেমন (void*)0) cast

NULLএকটি ম্যাক্রো, সংজ্ঞায়িত <stddef.h>এবং অন্যান্য বেশ কয়েকটি মানক শিরোনাম, এটি একটি বাস্তবায়ন-সংজ্ঞায়িত নাল পয়েন্টার ধ্রুবকে প্রসারিত করে । প্রসারণটি সাধারণত হয় হয় 0বা ((void*)0)(অন্যান্য ভাষার নিয়ম মেটানোর জন্য বাহ্যিক বন্ধনীগুলির প্রয়োজন হয়)।

সুতরাং একটি আক্ষরিক 0, যখন একটি প্রসঙ্গে ব্যবহৃত হয় যা পয়েন্টার ধরণের অভিব্যক্তি প্রয়োজন, সর্বদা একটি হিসাবে null pointerঅর্থাত্, একটি অনন্য পয়েন্টার মান যা কোনও বস্তুর দিকে নির্দেশ করে তা মূল্যায়ন করে । এটি নাল পয়েন্টারের উপস্থাপনা সম্পর্কে কিছু বোঝায় না । নাল পয়েন্টারগুলিকে খুব সাধারণভাবে সমস্ত বিট-শূন্য হিসাবে উপস্থাপন করা হয় তবে এগুলি যে কোনও কিছু হিসাবে উপস্থাপন করা যায়। কিন্তু এমনকি যদি একটি নাল পয়েন্টার হিসাবে প্রতিনিধিত্ব করা হয় , বা এখনও একটি হল নাল পয়েন্টার ধ্রুবক0xDEADBEEF0(void*)0

এই উত্তরটি করার Stackoverflow প্রশ্ন এই ভাল জুড়ে।

এটি অন্যান্য জিনিসের সাথে বোঝায় যে memset()বা calloc()যা, যা সমস্ত বিট-শূন্যকে মেমরির একটি অঞ্চল সেট করতে পারে, অগত্যা সেই অঞ্চলে কোনও পয়েন্টারকে নাল পয়েন্টারে সেট করবে না। তারা সম্ভবত বেশিরভাগ বাস্তবায়নে এমনটি করতে পারে তবে ভাষা এটির গ্যারান্টি দেয় না।

আমি কেন এই প্রশ্ন সদৃশ বিবেচনা করা হয় না জানি না এই এক , বা কিভাবে তা এখানে সাময়িক আছে।


1
সি এর নকশা এবং বিবর্তনের সাথে আমার অন্যতম উত্স হ'ল অঙ্ক শূন্যটি নাল পয়েন্টারটির অবহিত প্রতিনিধিত্ব হিসাবে ব্যবহার করা অব্যাহত রয়েছে। ভাষার প্রথম দিকের প্রথমদিকে (যেমন ফাংশন প্রোটোটাইপের মতো জিনিসগুলির আবিষ্কারের আগে), পয়েন্টার এবং পূর্ণসংখ্যার পর্যাপ্ত পরিমাণে মতভেদযোগ্য ছিল যে নাল পয়েন্টারের জন্য "0" ব্যবহার করা সহজ ছিল এবং এটি "কেবলমাত্র কাজ করবে"। একবার পূর্ণসংখ্যার পরিমাণ শূন্য এবং নাল পয়েন্টারের মধ্যে পার্থক্য করার জন্য প্রয়োজনীয় হয়ে ওঠে, তবে, "0" উপস্থাপনাটি কোনও কীওয়ার্ড বা অপারেটর ক্রমের পক্ষে অবতরণ করা উচিত ছিল।
সুপারক্যাট

প্ল্যাটফর্মের উপর নির্ভর করে যখন এনইউএলকে বরাদ্দ করা হয় তখন এর অর্থ কি NUL পয়েন্টারটি আসলে কোনও জায়গায় নির্দেশ করতে পারে? নাল পয়েন্টার ধ্রুবক সম্ভবত একটি সিনট্যাকটিক বিল্ড কিন্তু কোডটি চালানোর পরে ঠিক কী ঘটে? ধরা যাক এই সিনট্যাকটিক কনস্ট্রাক্টটি জিএনইউ / লিনাক্স প্ল্যাটফর্মে সংকলিত হয়েছে। যখন আমরা এটির জন্য NULL নির্ধারণ করি তখন পয়েন্টারের মানটি কী? এই ঠিকানাটি অন্য কোনও ঠিকানার থেকে কীভাবে আলাদা?
অরপিথ

1
@ অরপিথ: NULLকোনও পয়েন্টার অবজেক্টে নির্ধারিত , বা কোনও নাল পয়েন্টার স্থির , সেই বস্তুর মান একটি নাল পয়েন্টারকে সেট করে । যন্ত্রের স্তরে এটি মেমরির কিছু বৈধ অংশকে ভালভাবে নির্দেশ করতে পারে। একটি নাল পয়েন্টার নির্ধারণ করার সাথে আচরণের সংজ্ঞা নেই; 0x0000000আক্ষরিক অন্য কিছু যেমন ঠিকানায় মেমরির একটি অংশ অ্যাক্সেস করা বৈধ আচরণ। এই ঠিকানাটি অন্য কোনও ঠিকানার থেকে (ক) সমান তুলনা করে NULLএবং (খ) সি অবজেক্টের সাথে কোনও পয়েন্টারের সাথে অসম তুলনা করে পৃথক করা অন্য ঠিকানা থেকে পৃথক । নাল পয়েন্টার একটি নির্বিচার পয়েন্টার মান যা এটি কোনও কিছুর প্রতি নির্দেশ দেয় না তা বোঝাতে ব্যবহৃত হয়।
কিথ থম্পসন

1
মেশিন স্তরে এটি মেমরির কিছু বৈধ অংশের দিকে ইঙ্গিত করতে পারে তবে বেশিরভাগ সি পরিবেশে এটি অবৈধ মেমরিটিকে নির্দেশ করবে যাতে পয়েন্টার ব্যবহারের যে কোনও প্রচেষ্টা একটি হার্ডওয়্যার ট্র্যাপ / ফল্ট / ব্যতিক্রম ঘটায়। এটি সাধারণত কেবলমাত্র খুব সহজ হার্ডওয়্যার প্ল্যাটফর্মগুলিতে --- মেমরি পরিচালনার জন্য কোনও সমর্থন না করে --- যেখানে একটি নল পয়েন্টারটি একটি বৈধ মেমরির অবস্থানকে নির্দেশ করে।
সলোমন স্লো

7

বাহিরের প্রতিটি প্ল্যাটফর্ম NUL এর পছন্দ অনুসারে সংজ্ঞায়িত করতে পারে।

সি স্ট্যান্ডার্ড অনুসারে, আপনি যদি কোনও পয়েন্টারে শূন্য অর্পণ করেন তবে এটি একটি ন্যূনাল মানতে রূপান্তরিত হবে (সেই প্ল্যাটফর্মের জন্য However) তবে, আপনি যদি কোনও NULL পয়েন্টার নেন এবং এটি পূর্বে কাস্ট করেন তবে আপনার শূন্যের কোনও নিশ্চয়তা নেই বাইরে প্রতিটি প্ল্যাটফর্মে। তবে আসল বিষয়টি হ'ল বেশিরভাগ প্ল্যাটফর্মে এটি শূন্য হবে।

সি স্টাফের স্পেসিফিকেশনে আপনি যে জিনিসগুলি পেতে পারেন সে সম্পর্কে তথ্য । একটি উত্স, যে বিশ্বাসযোগ্যতাটির জন্য আমি প্রমাণ করতে পারি না, তা হ'ল: http://www.winapi.co.kr/pds/doc/ISO-C-FDIS.1999-04.pdf


2
যদি তারা মানটি থেকে বিরতি বেছে নেয় তবে তারা নতুন সংজ্ঞা দিতে পারে NULL pointer constant। আমি যতদূর জানি যে সেখানে কোনও সংকলক নেই যে এটি করে।
কার্লসন

সেখানে কি এমন কোনও সংকলক রয়েছে যা নুলকে 0 হিসাবে প্রয়োগ করে না? এবং নূলে কি মিথ্যা মূল্যায়নের গ্যারান্টিযুক্ত?
ugoren

মান দ্বারা মিথ্যাতে মূল্যায়নের গ্যারান্টিযুক্ত NULL। আমি জানি না যে এমন কোনও সংকলক (প্ল্যাটফর্ম, আসলে) আছে যা NULL কে 0 হিসাবে বাস্তবায়িত করে না এবং আমি গুরুতরভাবে সন্দেহ করি তবে মানকটি এটি নিষিদ্ধ করে না, তাই কে জানে।
মাইক নকিস

মেমোরিতে অ্যাবস্ট্রাক্ট "নাল পয়েন্টার ধ্রুবক" (যেমনটি অনুমান করা হয়েছে) উপস্থাপনের মধ্যে বিভ্রান্তি রয়েছে যা প্ল্যাটফর্ম নির্মাতাকে খুশি করতে পারে এবং NULLম্যাক্রোর সংজ্ঞা হিসাবে থাকতে পারে , যা 0সি ++ এবং অন্যথায় 0বা সিতে প্রসারিত হতে হবে (void *)0, কারণ এটিই আসল "নাল পয়েন্টার ধ্রুবক"।
জান হুডেক

যদিও NUL তত্ত্বীয়ভাবে কোনও হিসাবে সংজ্ঞায়িত করা যেতে পারে, তবে মান দ্বারা একটি গ্যারান্টি রয়েছে যে পয়েন্টারের সাথে 0 টাইপকাস্ট করা মান সহ একটি ধ্রুবক ধ্রুবকটি নাল পয়েন্টার হিসাবে দেখা দেয় (আইএসও 9899: 1999 6.3.2.3/3)। Stddef.h এর NULL ম্যাক্রো অবশ্যই নাল পয়েন্টার (7.17 / 3) হওয়া উচিত, সুতরাং সংকলকটির জন্য NULL কে 0 বা (অকার্যকর *) 0 হিসাবে বাস্তবায়ন না করা খুব ভারী হবে।

1

এটি সি ভাষায় সংজ্ঞায়িত হয়েছে কারণ এটির সাথে সমতুল্য কোনও মেশিন ঠিকানা নেই। যদি এটি হয় তবে আমাদের এটি থেকে কোনও বিমূর্ততা প্রয়োজন হবে না! যদিও বেশিরভাগ প্ল্যাটফর্মে, নূলে শেষ পর্যন্ত কিছু প্রকার বা অন্য কোনও হিসাবে 0 প্রয়োগ করা যেতে পারে, আপনি যদি একেবারেই বহনযোগ্যতার বিষয়ে চিন্তা করেন তবে এটি সর্বজনীনভাবে ধরে নেওয়া সহজভাবে ভুল।



0

মতে সি স্ট্যান্ডার্ড ডকুমেন্ট অধ্যায় 6.3.2.3:

মান 0 এর সাথে একটি পূর্ণসংখ্যক ধ্রুবক অভিব্যক্তি বা শূন্য * টাইপ করার জন্য এই জাতীয় এক্সপ্রেশনকে নাল পয়েন্টার ধ্রুবক বলা হয় 5৫) যদি নাল পয়েন্টার ধ্রুবকটি একটি পয়েন্টার ধরণের রূপান্তরিত হয় তবে ফলস্বরূপ পয়েন্টারটিকে নাল পয়েন্টার বলা হয় is কোনও অবজেক্ট বা ফাংশনের সাথে একটি পয়েন্টারের সাথে অসম তুলনা করার গ্যারান্টিযুক্ত।

এখনও অবধি আমি এমন কোনও সংকলক দেখিনি যা এ থেকে দূরে চলেছে।


@ পেটারট্রিক আপনি ঠিক বলেছেন এটি একটি টাইপ। :)
কার্লসন

1
হ্যাঁ, তবে লক্ষ্য করুন যে এটিতে 0 এর সংখ্যার মান থাকা পয়েন্টারটি সম্পর্কে কিছুই বলা হয় না It যদিও এটি বেশিরভাগ প্ল্যাটফর্মে এটি করে।
জান হুডেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.