নাল পয়েন্টারের জন্য ঠিকানা শূন্য কেন ব্যবহার করা হয়?


121

সি (বা সি ++ এর ক্ষেত্রে), পয়েন্টারগুলির মান শূন্য থাকলে বিশেষ হয়: পয়েন্টারগুলিকে স্মৃতিশক্তি মুক্ত করার পরে শূন্যে সেট করার পরামর্শ দেওয়া হয়, কারণ এর অর্থ আবার পয়েন্টারটি মুক্ত করা বিপজ্জনক নয়; আমি যখন ম্যালোককে কল করি তখন এটি শূন্যের সাথে একটি পয়েন্টার ফেরত দেয় যদি এটি আমার স্মৃতি পেতে না পারে; if (p != 0)উত্তীর্ণ পয়েন্টারগুলি বৈধ কিনা তা নিশ্চিত করতে আমি সমস্ত সময় ব্যবহার করি etc.

তবে যেহেতু মেমরি ঠিকানাটি 0 থেকে শুরু হয়, 0 অন্য কোনওের মতো ঠিক একটি বৈধ ঠিকানা হিসাবে নয়? যদি 0 টি হয় তবে নাল পয়েন্টারগুলি পরিচালনা করতে কীভাবে ব্যবহার করা যেতে পারে? পরিবর্তে একটি নেতিবাচক নম্বর কেন নাল নয়?


সম্পাদনা:

একগুচ্ছ ভাল উত্তর। আমার নিজের মন এর ব্যাখ্যা হিসাবে প্রকাশিত উত্তরে যা বলা হয়েছিল তা সংক্ষিপ্ত করব এবং আশা করি যে আমি ভুল বুঝতে পারলে সম্প্রদায়টি আমাকে সংশোধন করবে।

  • প্রোগ্রামিংয়ের অন্যান্য কিছুর মতো এটি একটি বিমূর্ততা। ঠিক একটি ধ্রুবক, ঠিকানার ঠিকানার সাথে সম্পর্কিত নয় 0 সি ++ 0x কীওয়ার্ড যুক্ত করে এটির উপর জোর দেয় nullptr

  • এটি কোনও ঠিকানা বিমূর্ততাও নয়, এটি সি স্ট্যান্ডার্ড দ্বারা নির্ধারিত ধ্রুবক এবং সংকলকটি এটি অন্য কোনও সংখ্যায় অনুবাদ করতে পারে যতক্ষণ না এটি নিশ্চিত হয় যে এটি কখনই একটি "আসল" ঠিকানার সমান নয় এবং যদি 0 টি না হয় তবে অন্যান্য নাল পয়েন্টার সমান হয় প্ল্যাটফর্মের জন্য ব্যবহারের সেরা মান।

  • যদি এটি কোনও বিমূর্ততা না হয়, যা প্রথম দিনগুলির ক্ষেত্রে ছিল, 0 ঠিকানাটি সিস্টেম দ্বারা ব্যবহৃত হয় এবং প্রোগ্রামারের সীমা ছাড়িয়ে যায়।

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

  • যদি কোনও সংখ্যা সর্বদা ডেটাটাইপ দ্বারা প্রতিনিধিত্বযোগ্য হয় তবে এটি 0 টি (সম্ভবত 1 টি খুব বেশি I [-2, 1] হবে।

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


11
আপনি সি এবং সি ++ এর সাধারণ অভিবাদন হিসাবে খুব সহজেই বদলে if (p != 0)যেতে পারেন if (p), যদিও জাভা গ্রহণ করলে আপনাকে অভ্যাস থেকে বেরিয়ে আসতে হবে।
পল টমবলিন

14
দু'বার কিছু মুছে ফেলার অর্থ আপনার কোডটি ভুল। আমি পয়েন্টারগুলি স্থগিত করার পরে পরামর্শ বাতিল করার পরে পরামর্শ দিচ্ছি যাতে আপনি সমস্যাটি ক্র্যাশ করতে এবং ঠিক করতে পারেন, এটি চাপাবেন না। যাই হোক না কেন, আপনি কোনও ঠিকানাটিকে কিছুটা পূর্ণসংখ্যা বলে ধরে নিতে ভুল করেন। এই অগত্যা সত্য নয়, এবং 0 নিছক প্রতিনিধিত্ব করে কিছু প্রকৃত পয়েন্টার মান যা বাস্তবায়ন-নির্দিষ্ট। একটি "নেতিবাচক ঠিকানা" ধারণাগতভাবে বোঝায় না।
GManNickG

6
@ জিএমান: সম্ভবত কোনও ঠিকানায় এমন একটি পয়েন্টার সেট করা ভাল ধারণা যা কোনও ক্রাশকে বাধ্য করবে, যেমন 0xDEADBEEF
বিলি ওনিল

5
যে প্রশ্ন কখনও মরে যাবে না!

8
@ নোয়া: বিন্দুটি নালায় সেট করা হয়েছে -> প্রোগ্রামিং ত্রুটিগুলি আড়াল করুন, বাতিল করতে যাবেন না -> প্রোগ্রামিং ত্রুটিগুলি সন্ধান করুন। আমি আপনার সম্পর্কে জানি না, তবে আমি আমার কোডটি সঠিক রাখতে চাই।
GManNickG

উত্তর:


65

2 পয়েন্ট:

  • উত্স কোডের কেবল ধ্রুবক মান 0 নাল পয়েন্টার - সংকলক বাস্তবায়ন চলমান কোডে যা প্রয়োজন বা যা প্রয়োজন মান ব্যবহার করতে পারে। কিছু প্ল্যাটফর্মের একটি বিশেষ পয়েন্টার মান রয়েছে যা 'অবৈধ' যা প্রয়োগটি নাল পয়েন্টার হিসাবে ব্যবহার করতে পারে। সিএফএইউএর একটি প্রশ্ন রয়েছে, "সিরিয়াসলি, সত্যিকারের কোনও মেশিনের কি সত্যিই ননজারো নাল পয়েন্টার ব্যবহার করেছে, বা বিভিন্ন ধরণের পয়েন্টারগুলির জন্য বিভিন্ন উপস্থাপনা?" , এটি বেশ কয়েকটি প্ল্যাটফর্মগুলি নির্দেশ করে যা 0 টির এই সম্পত্তিটি সি উত্সে নাল পয়েন্টার হিসাবে ব্যবহৃত হয় যখন রানটাইমগুলিতে আলাদাভাবে উপস্থাপিত হয়। সি ++ স্ট্যান্ডার্ডের একটি নোট রয়েছে যা পরিষ্কার করে যে "মান শূন্যের সাথে একটি অবিচ্ছেদ্য ধ্রুবক অভিব্যক্তি সর্বদা নাল পয়েন্টার দেয়,

  • একটি নেতিবাচক মান ঠিকানার মতো প্ল্যাটফর্মের মতোই ব্যবহারযোগ্য হতে পারে - সি স্ট্যান্ডার্ডকে নাল পয়েন্টারটি নির্দেশ করতে কেবল কিছু ব্যবহার করতে হবে, এবং শূন্যটি বেছে নেওয়া হয়েছিল। আমি সত্যই নিশ্চিত নই যে অন্য সেন্ডিনেল মান বিবেচিত হয়েছিল কিনা।

নাল পয়েন্টারের একমাত্র প্রয়োজনীয়তা হ'ল:

  • এটি একটি আসল বস্তুর সাথে পয়েন্টারের সাথে অসম তুলনা করার গ্যারান্টিযুক্ত
  • যে কোনও দুটি নাল পয়েন্টার সমান তুলনা করবে (সি ++ এটি এমনভাবে সংশোধন করে যে এটি কেবল একই ধরণের পয়েন্টার ধরে রাখা প্রয়োজন)

12
+1 আমার সন্দেহ হয় 0 কেবল historicalতিহাসিক কারণে বেছে নেওয়া হয়েছিল। (0 বেশিরভাগ সময় একটি শুরুর এবং অবৈধ ঠিকানা)) অবশ্যই সাধারণভাবে এই ধারণাটি সর্বদা সত্য হয় না তবে 0 বেশ কার্যকরভাবে কাজ করে।
GManNickG

8
স্থানটিও অবদান রাখার কারণ হতে পারে। যে দিনগুলিতে সি প্রথম বিকাশ হয়েছিল, সেদিনগুলিতে স্মৃতি এখনকার চেয়ে অনেক বেশি ব্যয়বহুল ছিল। শূন্য সংখ্যাটি একটি এক্সওআর নির্দেশিকা ব্যবহার করে বা তাত্ক্ষণিক মান লোড করার প্রয়োজন ছাড়াই সুবিধার সাথে গণনা করা যায়। আর্কিটেকচারের উপর নির্ভর করে এটি সম্ভাব্য স্থান সংরক্ষণ করতে পারে।
স্পার্কি

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

10
মিনিক্স 16 বিট সংকলক NUL এর জন্য 0xFFFF ব্যবহার করেছে।
জোশুয়া

3
অনেক এম্বেড থাকা সিস্টেমে 0 টি একটি বৈধ ঠিকানা। মান -1 (সমস্ত বিট এক) এছাড়াও একটি বৈধ ঠিকানা। আরএমএসের জন্য চেকসামগুলি গণনা করা শক্ত যখন ডেটা ঠিকানায় ০. :-( শুরু হয়
টমাস ম্যাথিউজ

31

Icallyতিহাসিকভাবে, 0 থেকে শুরু করা ঠিকানাটি সর্বদা রম ছিল, কিছু অপারেটিং সিস্টেম বা নিম্ন স্তরের বিঘ্নিত হ্যান্ডলিং রুটিনগুলির জন্য ব্যবহৃত হয়, আজকাল, যেহেতু সবকিছু ভার্চুয়াল (ঠিকানার স্থান সহ), অপারেটিং সিস্টেমটি কোনও ঠিকানায় কোনও বরাদ্দকে মানচিত্র করতে পারে, তাই এটি করতে পারে নির্দিষ্টভাবে ঠিকানা 0 তে কিছু বরাদ্দ নেই।


6
এটা বেশ। এটি historicalতিহাসিক কনভেনশন দ্বারা, এবং প্রথম অ্যাড্রেসগুলি বাধাপ্রাপ্ত হ্যান্ডলারদের জন্য ব্যবহৃত হয়েছিল, সুতরাং এটি সাধারণ প্রোগ্রামগুলির জন্য অকার্যকর। এছাড়াও, 0 হল "খালি", যা কোনও মান / কোনও পয়েন্টার হিসাবে ব্যাখ্যা করা যায়।
টমটম

15

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


5
@ জাস্টিন: আপনি ভুল বুঝেছেন। ধ্রুব 0 0 সর্বদা নাল পয়েন্টার। @ মায়াদোর যা বলছে তা হ'ল সম্ভব যে নাল পয়েন্টার (ধ্রুবক 0 দ্বারা নির্দেশিত) ঠিকানা শূন্যের সাথে মিলে না। কিছু প্ল্যাটফর্মে, একটি নাল পয়েন্টার তৈরি করা ( int* p = 0) মান 0xdeadbeefবা এটি পছন্দ করে এমন কোনও মান যুক্ত একটি পয়েন্টার তৈরি করতে পারে । 0 হ'ল নাল পয়েন্টার, তবে শূন্যকে সম্বোধন করার জন্য একটি নাল পয়েন্টার অবশ্যই প্রয়োজন হয় না। :)
জাল্ফ

একটি নাল পয়েন্টার একটি সংরক্ষিত মান এবং সংকলক উপর নির্ভর করে যে কোনও বিট প্যাটার্ন হতে পারে। NULL পয়েন্টারটির অর্থ এই নয় যে এটি 0
শার্জিল আজিজ

3
কিন্তু @Jalf, ধ্রুবক 0 নয় সবসময় নাল পয়েন্টার। প্ল্যাটফর্মটির আসল নাল পয়েন্টারটি আমাদের জন্য সংকলকটি পূরণ করতে চাইলে আমরা এটিই লিখি । কার্যকরীভাবে ভাষী, নাল পয়েন্টার সাধারণত করে মিলা ঠিকানা শুন্যতে, যদিও, এবং আমি জিজ্ঞাসা কেন যে হয় যেমন জোএল প্রশ্নের ব্যাখ্যা। সম্ভবত এই ঠিকানায় মেমরির একটি বৈধ বাইট আছে, সর্বোপরি, সুতরাং কেন না খেলতে একটি বৈধ বাইট অপসারণের পরিবর্তে অস্তিত্বহীন বাইটের একটি অস্তিত্বের ঠিকানা ব্যবহার করবেন না? (আমি জোয়েল যা ভাবছিলাম তা লিখছি, আমি নিজেই জিজ্ঞাসা করছি এমন একটি প্রশ্ন নয়)
রব কেনেডি

@ রব: বাছাই করুন। আপনি কী বলতে চাইছেন তা আমি জানি এবং আপনি সঠিক, তবে আমিও আছি :) :) ধ্রুবক পূর্ণসংখ্যা 0 একটি উত্স কোড স্তরের নাল পয়েন্টারকে উপস্থাপন করে। 0 টি শূন্য পয়েন্টারের সাথে তুলনা করা সত্য। পয়েন্টারকে 0 নির্ধারণ করে যে পয়েন্টারটি নালায় সেট করে। 0 হল নাল পয়েন্টার। তবে নাল পয়েন্টারের প্রকৃত ইন-মেমরি উপস্থাপনা শূন্য বিট প্যাটার্ন থেকে আলাদা হতে পারে। (যাইহোক, আমার মন্তব্যটি @ জাস্টিনের এখন মুছে ফেলা মন্তব্যের প্রতিক্রিয়াতে ছিল, @ জোয়েলের প্রশ্নের প্রতিক্রিয়া নয় :) :)
জালফ

আমি মনে করি @ জালফ @ রব আপনার স্পষ্ট করার জন্য কিছু পদ দরকার। :) §4.10 / 1 থেকে: "একজন নাল পয়েন্টার ধ্রুবক । পূর্ণসংখ্যা টাইপ অবিচ্ছেদ্য ধ্রুবক অভিব্যক্তি rvalue যে শূন্য একটি নাল পয়েন্টার ধ্রুবক মূল্যায়ণ একটি পয়েন্টার টাইপ রূপান্তরিত করা যেতে পারে; ফল নাল পয়েন্টার মান যে ধরনের এবং পয়েন্টার অবজেক্ট বা পয়েন্টার থেকে ফাংশন প্রকারের প্রতিটি অন্যান্য মান থেকে পৃথক। "
GManNickG

15

আপনাকে অবশ্যই পয়েন্টার প্রসঙ্গে স্থির শূন্যের অর্থ ভুল বোঝাবুঝি করতে হবে।

সি বা সি ++ পয়েন্টারগুলিতে কোনওটিরই "মান শূন্য থাকতে পারে"। পয়েন্টারগুলি গাণিতিক বস্তু নয়। "শূন্য" বা "নেতিবাচক" বা or প্রকৃতির যে কোনও কিছুর মতো তাদের সংখ্যাসূচক মান থাকতে পারে না। সুতরাং আপনার "পয়েন্টার ... মান শূন্য আছে" সম্পর্কে আপনার বক্তব্যটি কোনও অর্থহীন নয়।

সি ও সিতে ++ পয়েন্টারগুলিতে নাল-পয়েন্টারটির সংরক্ষণযোগ্য মান থাকতে পারে । নাল-পয়েন্টার মানের প্রকৃত উপস্থাপনাটির কোনও "জিরো" এর সাথে কোনও সম্পর্ক নেই। এটি প্রদত্ত প্ল্যাটফর্মের জন্য উপযুক্ত কিছু হতে পারে। এটি সত্য যে বেশিরভাগ প্ল্যাটফর্মে নাল পয়েন্টার মানটি প্রকৃত শূন্য ঠিকানা মান দ্বারা শারীরিকভাবে উপস্থাপিত হয়। যাইহোক, যদি কোনও প্ল্যাটফর্মের ঠিকানা 0 আসলে কোনও উদ্দেশ্যে ব্যবহৃত হয় (যেমন আপনাকে ঠিকানা 0 তে অবজেক্ট তৈরি করতে হবে), এই জাতীয় প্ল্যাটফর্মের নাল-পয়েন্টার মান সম্ভবত আলাদা হবে। এটি শারীরিকভাবে 0xFFFFFFFFঠিকানা মান হিসাবে বা হিসাবে প্রদর্শিত হতে পারে0xBAADBAAD , উদাহরণস্বরূপ।

তবুও, কোনও নির্দিষ্ট প্ল্যাটফর্মে নাল-পয়েন্টার মানটি কীভাবে সম্মানিত হয় তা নির্বিশেষে, আপনার কোডে আপনি এখনও ধ্রুবক দ্বারা নাল-পয়েন্টার নির্ধারণ করতে থাকবেন 0। প্রদত্ত পয়েন্টারটিতে নাল-পয়েন্টার মান নির্ধারণের জন্য, আপনি পছন্দ মত প্রকাশ করতে থাকবেন p = 0। আপনি যা চান তা উপলব্ধি করে যথাযথ নাল-পয়েন্টার মান উপস্থাপনায় অনুবাদ করতে এটি সংকলকের দায়িত্ব, উদাহরণস্বরূপ, কোডটিতে এটি অনুবাদ 0xFFFFFFFFকরা যা পয়েন্টারের ঠিকানার মান রাখবে p

সংক্ষেপে, আপনি 0নাল-পয়েন্টার মান উত্পন্ন করতে আপনার ম্যাসেজ কোডটি ব্যবহার করার অর্থ এই নয় যে নাল-পয়েন্টার মানটি কোনওভাবে ঠিকানার সাথে আবদ্ধ 00যে আপনি আপনার সোর্স কোড ব্যবহার শুধু "অন্বিত চিনি" একেবারে প্রকৃত শারীরিক ঠিকানা নাল-পয়েন্টার মান "নির্দেশ" হয় কোনও সম্পর্ক রয়েছে।


3
<quotes> পয়েন্টারগুলি গাণিতিক বস্তু নয় </ quot> পয়েন্টার গাণিতিকগুলি সি এবং সি ++ তে বেশ ভালভাবে সংজ্ঞায়িত হয়েছে। প্রয়োজনীয়তার অংশটি হ'ল উভয় পয়েন্টার একই সংমিশ্রনের মধ্যে নির্দেশ করে। নাল পয়েন্টারটি কোনও যৌগিককে নির্দেশ করে না তাই এটি পয়েন্টার গাণিতিক এক্সপ্রেশনগুলিতে ব্যবহার করা অবৈধ। উদাহরণস্বরূপ, এটি গ্যারান্টিযুক্ত নয় (p1 - nullptr) - (p2 - nullptr) == (p1 - p2)
বেন ভয়েগ্ট

5
@ বেন ভয়েগ্ট: ভাষার স্পেসিফিকেশন পাটিগণিত ধরণের ধারণাকে সংজ্ঞায়িত করে । আমি যা বলছি তা হ'ল পয়েন্টার প্রকারগুলি পাটিগণিত ধরণের বিভাগের সাথে সম্পর্কিত নয়। পয়েন্টার গাণিতিক একটি পৃথক এবং সম্পূর্ণ সম্পর্কহীন গল্প, নিছক ভাষাগত কাকতালীয় ঘটনা।
এন্টি

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

ওয়েল, উদাহরণস্বরূপ শব্দটি স্কালে বস্তু সি / C ++ পরিভাষা শুধু জন্য একটি সাঁটে লেখার হয় স্কালে ধরনের বস্তু (ঠিক মত POD বস্তু = POD ধরনের অবজেক্ট )। আমি গাণিতিক পদার্থটি একইভাবে ব্যবহার করেছি, অর্থগণিতের ধরণের পদার্থ । আমি আশা করি "কেউ" এটি সেভাবে বুঝতে পারে। যে কেউ সর্বদা স্পষ্টতা চাইতে পারে না।
এএনটি

1
আমি এমন একটি সিস্টেমে কাজ করেছি যেখানে (হার্ডওয়্যার সম্পর্কিত যতদূর) নাল 0xffffffff এবং 0 ছিল একটি সম্পূর্ণ বৈধ ঠিকানা
pm100

8

তবে যেহেতু মেমরি ঠিকানাটি 0 থেকে শুরু হয়, 0 অন্য কোনওের মতো ঠিক একটি বৈধ ঠিকানা হিসাবে নয়?

কিছু / অনেকগুলি / সমস্ত অপারেটিং সিস্টেমে মেমরি ঠিকানা 0 কোনও উপায়ে বিশেষ। উদাহরণস্বরূপ, এটি প্রায়শই অবৈধ / অস্তিত্বহীন মেমরিতে ম্যাপ করা হয় যা আপনি এটি অ্যাক্সেস করার চেষ্টা করলে একটি ব্যতিক্রম ঘটায়।

পরিবর্তে একটি নেতিবাচক নম্বর কেন নাল নয়?

আমি মনে করি যে পয়েন্টার মানগুলি সাধারণত স্বাক্ষরযুক্ত সংখ্যা হিসাবে বিবেচিত হয়: অন্যথায় উদাহরণস্বরূপ 32-বিট পয়েন্টারটি 4 গিগাবাইটের পরিবর্তে কেবল 2 গিগাবাইট মেমরিকেই সম্বোধন করতে সক্ষম হবে।


4
আমি এমন কোনও ডিভাইসে কোড করেছি যেখানে ঠিকানা শূন্যটি একটি বৈধ ঠিকানা ছিল এবং কোনও মেমরির সুরক্ষা ছিল না। নাল পয়েন্টারগুলিও অল-বিট-শূন্য ছিল; যদি আপনি দুর্ঘটনাক্রমে একটি নাল পয়েন্টারটিতে লিখেছিলেন তবে আপনি শূন্য ঠিকানার ওএস সেটিংসের উপরে ব্লাস্ট করেছেন; উদ্দীপনা সাধারণত ফলস্বরূপ না।
এমএম

1
হ্যাঁ: একটি সুরক্ষিত-মোড x86 সিপিইউতে উদাহরণস্বরূপ, ঠিকানা 0 হ'ল বিঘ্নিত ভেক্টর টেবিল
ক্রিসডাব্লু

@ ক্রিসডাব্লু: অ-সুরক্ষিত-মোড x86 এ, বিশেষত শূন্যের ঠিকানা হ'ল বিভাজন দ্বারা শূন্য বিঘ্নিত ভেক্টর, যা কিছু প্রোগ্রামের লেখার সম্পূর্ণ বৈধ কারণ থাকতে পারে।
সুপারক্যাট

এমনকি এমন প্ল্যাটফর্মগুলিতে যেখানে ব্যবহারযোগ্য স্টোরেজটি শারীরিক ঠিকানায়, শূন্য থেকে শুরু হবে, সি প্রয়োগকারী সহজেই ঠিকানা শূন্য ব্যবহার করে এমন কোনও বস্তু ধরে রাখতে পারে যার ঠিকানা কখনও নেওয়া হয় না, বা অন্যথায় কেবল মেমরির প্রথম শব্দটি অব্যবহৃত ছেড়ে দেয়। বেশিরভাগ প্ল্যাটফর্মে, শূন্যের সাথে তুলনা-করা কোনও নির্দেশের তুলনায় কোনও কিছু-এর সাথে তুলনা করে-সংরক্ষণ করে, তাই এমনকি স্টোরেজের প্রথম শব্দটি নালার জন্য শূন্য-বিহীন ঠিকানা ব্যবহার করার চেয়ে সস্তা হবে। নোট করুন যে সি স্ট্যান্ডার্ড দ্বারা আচ্ছাদিত জিনিসগুলির ঠিকানাগুলি (যেমন I / O বন্দর বা বিঘ্নিত ভেক্টরগুলি)
অসমকে

... সিস্টেম প্রক্রিয়া নাল-পয়েন্টার অন্য যে কোনও থেকে আলাদাভাবে অ্যাক্সেস করে, সুতরাং অল-বিট-শূন্য সাধারণত "নাল" জন্য এমন একটি সূক্ষ্ম ঠিকানা যা এমনকি সিস্টেমে যেখানে শারীরিক অবস্থান শূন্যে অ্যাক্সেস করা দরকারী এবং অর্থবোধক হবে।
সুপারক্যাট

5

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

(বেশিরভাগ আইএসএ কেবলমাত্র ALU নির্দেশাবলীতে ফ্ল্যাগ সেট করে, লোড নয়, যদিও এবং সাধারণত আপনি সি উত্স পার্স করার সময় সংকলক ব্যতীত গণনার মাধ্যমে পয়েন্টার তৈরি করেন না) But তবে কমপক্ষে আপনার কোনও বিন্দু বিন্দু-প্রস্থের ধ্রুবক প্রয়োজন হবে না তুলনা করুন।)

কমোডোর পোষা, ভিস20, এবং সি 64 এ আমি যে প্রথম মেশিনে কাজ করেছি, র‌্যামটি 0 নম্বর থেকে শুরু হয়েছিল তাই আপনি যদি সত্যিই চান তবে কোনও নাল পয়েন্টার ব্যবহার করে এটি পড়া এবং লেখার পক্ষে সম্পূর্ণ বৈধতা ছিল।


3

আমি মনে করি এটি কেবল একটি সম্মেলন। একটি অবৈধ পয়েন্টার চিহ্নিত করতে অবশ্যই কিছু মান থাকতে হবে।

আপনি ঠিক ঠিকানা জায়গার একটি বাইট হারাবেন, এটি খুব কমই সমস্যা হওয়া উচিত।

কোনও নেতিবাচক পয়েন্টার নেই। পয়েন্টার সর্বদা স্বাক্ষরবিহীন হয়। এছাড়াও যদি তারা নেতিবাচক হতে পারে তবে আপনার কনভেনশনটির অর্থ হল আপনি ঠিকানার অর্ধেক স্থান হারাবেন।


দ্রষ্টব্য: আপনি আসলে ঠিকানা স্থান হারাবেন না; আপনি করছেন দ্বারা ঠিকানা 0 একটি পয়েন্টার পেতে পারেন: char *p = (char *)1; --p;। যেহেতু একটা নাল পয়েন্টার আচরণটি মান দ্বারা অনির্দিষ্ট থাকে, সিস্টেম থাকতে পারে pআসলে পড়া এবং লেখার ঠিকানা 0, বৃদ্ধি ঠিকানা দিতে 1, ইত্যাদি
এম এম

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

ITYM @supercat *(char *)0। এটি সত্য, তবে আমার পরামর্শে বাস্তবায়নের *(char *)0জন্য অন্য কোনও নাল পয়েন্টার ক্রিয়াকলাপ বা আচরণের সংজ্ঞা দেওয়ার দরকার নেই ।
এমএম

1
@ ম্যাটম্যাকনাব: আচরণটি char *p = (char*)1; --p;কেবলমাত্র সেই মান দ্বারা সংজ্ঞায়িত করা যেতে পারে যদি সেই ক্রমটি কোনও অবজেক্টের প্রথম বাইট ব্যতীত অন্য কোনও কিছুতে পয়েন্টারের পরে সম্পাদন করা হত intptr_tএবং সেই নিক্ষেপের ফলাফলটি মান 1 প্রদান করে happened , এবং সেই বিশেষ ক্ষেত্রে ফলাফলটি --pতার পূর্ববর্তী বাইটে একটি পয়েন্টার উত্পন্ন করবে যার পয়েন্টার মান, যখন ফেলে দেওয়া হবে তখন intptr_tফলন হয়েছিল 1
সুপারক্যাট

3

যদিও সি নাল পয়েন্টারটি উপস্থাপন করতে 0 ব্যবহার করে তবে মনে রাখবেন যে পয়েন্টারের মান নিজেই শূন্য নাও হতে পারে। তবে, বেশিরভাগ প্রোগ্রামার কেবল এমন সিস্টেম ব্যবহার করবে যেখানে নাল পয়েন্টারটি আসলে, 0।

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


3
এই সমস্ত কিছুর পেছনে সম্ভবত আরও বেশি কারণ হ'ল: শূন্যের প্রাক-ইনিশিয়েশন করা মেমরি হস্তান্তর করা সস্তা এবং সেই স্মৃতিতে মানগুলি পাওয়া সুবিধাজনক 0, ভাসমান পয়েন্ট 0.0 এবং নাল পয়েন্টারের মতো অর্থপূর্ণ কিছু উপস্থাপন করে। সি-তে স্থিতিশীল ডেটা যা শূন্য / নাল থেকে শুরু করা হয় এক্সিকিউটেবলের কোনও স্থান দখল করতে হয় না এবং লোড হওয়ার পরে শূন্য-পূর্ণ ব্লকে ম্যাপ করা হয়। জিরো মেশিনের ভাষাগুলিতেও বিশেষ চিকিত্সা পেতে পারে: "শূন্যের সমান হলে শাখা" ইত্যাদির মতো সহজ শূন্যের তুলনা এমআইপিএস এমনকি একটি ডামি নিবন্ধ রয়েছে যা কেবল একটি শূন্য ধ্রুবক।
কাজ

2

Icallyতিহাসিকভাবে কোনও অ্যাপ্লিকেশনটির স্বল্প স্মৃতি সিস্টেম সংস্থান দ্বারা দখল করা হয়েছিল। এই দিনগুলিতে শূন্য ডিফল্ট নাল মান হয়ে যায়।

যদিও এটি আধুনিক সিস্টেমগুলির জন্য অগত্যা সত্য নয়, মেমরির বরাদ্দ আপনাকে যা দিয়েছে তা ব্যতীত অন্য কোনও কিছুতে পয়েন্টার মান নির্ধারণ করা এখনও একটি খারাপ ধারণা।


2

মুছে যাওয়ার পরে কোনও পয়েন্টার সেট না করার বিষয়ে যুক্তি সম্পর্কিত যাতে ভবিষ্যতে "ত্রুটিগুলি প্রকাশ করে" মুছে ফেলা হয় ...

যদি আপনি সত্যই সত্যই উদ্বিগ্ন হন তবে আরও ভাল পদ্ধতির, যা কাজের গ্যারান্টিযুক্ত, হ'ল উত্তোলন করা ():


...
assert(ptr && "You're deleting this pointer twice, look for a bug?");
delete ptr;
ptr = 0;
...

এটির জন্য কিছু অতিরিক্ত টাইপিং, এবং ডিবাগ তৈরির সময় একটি অতিরিক্ত চেক প্রয়োজন, তবে আপনি যা চান তা তা নিশ্চিত করা: পিটিআর যখন 'দু'বার মুছে ফেলা হবে তখন বিজ্ঞপ্তি। মন্তব্য আলোচনায় প্রদত্ত বিকল্পটি, পয়েন্টারটি বাতিল করার উদ্দেশ্যে নির্ধারণ না করা যাতে আপনি ক্র্যাশ পান, কেবল সফল হওয়ার গ্যারান্টি নেই। সবচেয়ে খারাপ বিষয়, উপরের মতো নয়, যদি এই "বাগ "গুলির মধ্যে একটি শেল্ফটি দিয়ে যায় তবে এটি ব্যবহারকারীর উপর ক্রাশ (বা আরও খারাপ!) সৃষ্টি করতে পারে। অবশেষে, এই সংস্করণটি আপনাকে আসলে কী ঘটে তা দেখতে প্রোগ্রাম চালিয়ে যেতে দেয়।

আমি বুঝতে পেরেছি যে এটি জিজ্ঞাসা করা প্রশ্নের উত্তর দেয় না, তবে আমি ভীত ছিলাম যে মন্তব্যগুলি পড়ে কেউ এই সিদ্ধান্তে আসতে পারে যে এটি 'ভাল অনুশীলন' বলে মনে করা হয় যদি এটি সম্ভব হয় তবে তারা বিনা মূল্যে প্রেরণ করা সম্ভব হলে 0-তে পয়েন্টার সেট না করে () বা দু'বার মুছুন। এই কয়েকটি ক্ষেত্রে যখন এটি সম্ভব হয় তখনই ডিবাগিং সরঞ্জাম হিসাবে অপরিজ্ঞাত আচরণটি ব্যবহার করা ভাল অভ্যাস নয়। অবশেষে অবৈধ পয়েন্টার মুছে ফেলার কারণে সৃষ্ট বাগটি খুঁজে বের করতে হবে এমন কেউই এর প্রস্তাব দিতে পারে না। এই ধরণের ত্রুটিগুলি শিকার করতে কয়েক ঘন্টা সময় নেয় এবং প্রায় সম্পূর্ণরূপে প্রোগ্রামটিকে সম্পূর্ণ অপ্রত্যাশিতভাবে প্রভাবিত করে যা মূল সমস্যাটিতে ফিরে আসা অসম্ভব কঠিন।


2

নাল পয়েন্টার উপস্থাপনের জন্য অনেক অপারেটিং সিস্টেম অল-বিট-শূন্য ব্যবহার করার একটি গুরুত্বপূর্ণ কারণ হ'ল এটির অর্থ memset(struct_with_pointers, 0, sizeof struct_with_pointers)এবং অনুরূপ সমস্ত পয়েন্টারকে struct_with_pointersনাল পয়েন্টারে সেট করে। এটি সি স্ট্যান্ডার্ড দ্বারা গ্যারান্টিযুক্ত নয়, তবে অনেকগুলি প্রোগ্রাম এটি ধরে নেয়।


1

পুরানো ডিইসি মেশিনগুলির একটিতে (পিডিপি -8, আমি মনে করি), সি রানটাইম মেমরির প্রথম পৃষ্ঠাকে মেমরির সুরক্ষা দেয় যাতে সেই ব্লকের মেমরির অ্যাক্সেসের যে কোনও প্রচেষ্টা ব্যতিক্রম হওয়ার কারণ হয়ে দাঁড়ায়।


PDP-8 তে কোনও সি সংকলক ছিল না। পিডিপি -11 এর কোনও মেমরি সুরক্ষা ছিল না এবং ভ্যাক্স চুপচাপ 0 টি এনউএলএল পয়েন্টার ডিফারেন্সে ফিরে যাওয়ার জন্য কুখ্যাত ছিল। আমি নিশ্চিত না যে এটি কোন মেশিনকে বোঝায়।
ফুজ

1

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


1

এর কিছু মূল্য থাকতে হবে। স্পষ্টতই আপনি যে মানগুলি ব্যবহারকারী বৈধভাবে ব্যবহার করতে চাইতে পারেন তাতে পদক্ষেপ নিতে চান না। আমি অনুমান করব যেহেতু সি রানটাইম বিএসএস বিভাগকে শূন্য-ইনিশিয়ালাইজড ডেটা সরবরাহ করে, তাই এটি শূন্যকে একটি অ-আরম্ভীকৃত পয়েন্টার মান হিসাবে ব্যাখ্যা করার জন্য একটি নির্দিষ্ট মাত্রার বোধ করে।


0

খুব কমই কোনও ওএস আপনাকে ঠিকানায় লিখতে দেয় 0 টি সাধারণ মেশিনে ওএস-নির্দিষ্ট স্টাফটি আটকে রাখা সাধারণ; যেমন, আইডিটি, পৃষ্ঠার সারণী ইত্যাদি ( সিস্টেম টেবিলগুলি উইলি-নিলি সম্পাদনা করুন।

তারা সি তৈরি করার সময় কে ও আরের মনে এগুলি নাও থাকতে পারে, তবে এটি (0 == নাল মনে রাখা বেশ সহজ) বরাবর 0 একটি জনপ্রিয় পছন্দ করে তোলে।


এই সুরক্ষিত মোডে সত্য নয়, এবং আসলে, নির্দিষ্ট লিনাক্স কনফিগারেশনে, আপনি করতে পারেন ভার্চুয়াল অ্যাড্রেস 0. লিখতে
L̳o̳̳n̳̳g̳̳p̳o̳̳k̳̳e̳̳

0

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

সৌভাগ্যক্রমে, সি ++ 0x "একটি পরিচিত অবৈধ পয়েন্টার যে অবিচ্ছেদ্য এক্সপ্রেশন জন্য শূন্য bitwise ম্যাপ নেই এর মানে হল যে অভিব্যক্তি" এর জন্য একটি নতুন শব্দ আছে: nullptr। যদিও এমন কয়েকটি সিস্টেম রয়েছে যা আপনি সি ++ দিয়ে লক্ষ্যবস্তু করতে পারেন যা বার্ফিং ছাড়াই 0 নম্বরটিকে ডেরেফারিংয়ের অনুমতি দেয়, তাই প্রোগ্রামার সাবধান হন।


0

এই থ্রেডটিতে ইতিমধ্যে প্রচুর ভাল উত্তর রয়েছে; 0নাল পয়েন্টারগুলির জন্য মানটি পছন্দ করার জন্য বিভিন্ন কারণ সম্ভবত রয়েছে তবে আমি আরও দুটি যুক্ত করতে যাচ্ছি:

  • সি ++ এ, পয়েন্টার শূন্য-সূচনাকরণ এটিকে নালায় সেট করবে।
  • অনেক প্রসেসরের ক্ষেত্রে এটি 0 থেকে মান নির্ধারণ করা বা অন্য ধ্রুবকের চেয়ে 0 এর সমান / সমান নয় এটি পরীক্ষা করা আরও দক্ষ is

0

এটি সি / সি ++ এর পয়েন্টারগুলির প্রয়োগের উপর নির্ভরশীল। এনইউএলএল একটি পয়েন্টারের ক্ষেত্রে কার্যক্ষমতার সমতুল্য হওয়ার কোনও নির্দিষ্ট কারণ নেই।


-1

এর historicতিহাসিক কারণ রয়েছে তবে এর জন্য অপ্টিমাইজেশন কারণও রয়েছে।

ওএসের পক্ষে মেমোরি পৃষ্ঠাগুলি 0 থেকে শুরু করে একটি প্রক্রিয়া সরবরাহ করা সাধারণ a আরম্ভ করা হয়নি। (অবিচ্ছিন্ন ফ্ল্যাশ পৃষ্ঠাগুলিতে প্রয়োগ করার পরে এটি এতটা ভাল কাজ করে না)

অন্য কারণটি হ'ল অনেকগুলি প্রসেসরে এটি খুব সহজেই 0 এর মান সমতুল্যতা পরীক্ষা করে নেওয়া হয় sometimes তুলনায় নির্দেশের স্ট্রিমে আক্ষরিক হিসাবে।

বেশিরভাগ প্রসেসরের জন্য সস্তা তুলনাগুলি হ'ল 0 এর চেয়ে কম স্বাক্ষরিত হয় এবং 0 এর সমান (0 এর চেয়ে বেশি স্বাক্ষরিত হয় এবং 0 এর সমান হয় না উভয় দ্বারা বোঝানো হয়)

যেহেতু সম্ভাব্য সমস্ত মানের মধ্যে 1 টির মানটিকে খারাপ বা অবিবেচনাযুক্ত হিসাবে সংরক্ষণ করা দরকার তবে আপনি এটির সাথে খারাপ মানের সমতুল্যের জন্য সবচেয়ে সস্তা পরীক্ষাও করতে পারেন। এটি '\ 0' সমাপ্ত চরিত্রের স্ট্রিংয়ের ক্ষেত্রেও সত্য।

আপনি যদি এই লক্ষ্যে আরও বেশি বা 0 এর চেয়ে কম ব্যবহার করার চেষ্টা করেন তবে আপনি আপনার ঠিকানাগুলির পরিধিকে অর্ধেক কেটে শেষ করবেন।


-2

ধ্রুব 0পরিবর্তে ব্যবহার করা হয় NULLকারণ সি বছর আগে কিছু cavemen ট্রিলিয়ান দ্বারাই সৃষ্ট হয়েছিল, NULL, NIL, ZIP, অথবা NADDAচেয়ে সব প্রণীত আরো অনেক কিছু অনুভূতি থাকতে হবে 0

তবে যেহেতু মেমরি ঠিকানাটি 0 থেকে শুরু হয়, 0 অন্য কোনওের মতো ঠিক একটি বৈধ ঠিকানা হিসাবে নয়?

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

যদি 0 টি হয় তবে নাল পয়েন্টারগুলি পরিচালনা করতে কীভাবে ব্যবহার করা যেতে পারে?

কারণ 0পয়েন্টারের তুলনায় ব্যবহৃত কিছু বাস্তবায়ন নির্দিষ্ট মানের সাথে প্রতিস্থাপন করা হবে যা ম্যালোক ব্যর্থতায় মালোকের ফেরত মান।

পরিবর্তে একটি নেতিবাচক নম্বর কেন নাল নয়?

এটি আরও বিভ্রান্তিকর হবে।


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

সেই সময় থেকে, সিটি বিকশিত হয়েছে যাতে এটি বিভিন্ন মেশিনের জন্য বিভিন্ন সংখ্যা এবং পয়েন্টারগুলির উপস্থাপনা সহ বিভিন্ন প্রোগ্রামের জন্য লেখার জন্য ব্যবহার করা যেতে পারে। নন-শূন্য সংখ্যার ধ্রুবকগুলি খুব কমই পয়েন্টার হিসাবে ব্যবহৃত হত, ধ্রুবক সংখ্যা শূন্যগুলি নাল পয়েন্টার উপস্থাপনের জন্য ব্যাপকভাবে ব্যবহৃত হত। এই জাতীয় ব্যবহার বাতিল করার জন্য বিদ্যমান কোডটি নষ্ট হয়ে গেছে, সুতরাং সংকলকগণ প্রত্যাশা করা হয়েছে যে বাস্তবায়ন যে কোনও নাল পয়েন্টার উপস্থাপন করতে ব্যবহার করে যাই হোক না কেন এটিতে একটি সংখ্যা শূন্য অনুবাদ করে।
সুপারক্যাট

-4

( পোস্ট পড়ার আগে দয়া করে এই অনুচ্ছেদটি পড়ুন।আমি এই পোস্টটি পড়তে আগ্রহী যে কাউকে জিজ্ঞাসা করছি এটি মনোযোগ সহকারে পড়ার চেষ্টা করা উচিত, এবং অবশ্যই আপনি এটি পুরোপুরি বুঝতে না পারলে এটিকে ডাউন করে দেবেন না, ধন্যবাদ। )

এটি এখন সম্প্রদায়ের উইকি, যেমন যদি কোনও ধারণার সাথে কেউ একমত না হয় তবে দয়া করে কী ভুল এবং কেন, তার স্পষ্ট ও বিস্তারিত ব্যাখ্যা সহ এটি সংশোধন করুন এবং যদি সম্ভব হয় তবে উত্সগুলি উদ্ধৃত করুন বা পুনরুত্পাদনযোগ্য প্রমাণ সরবরাহ করুন।

উত্তর

এখানে আরও কয়েকটি কারণ রয়েছে যা NULL == 0 এর অন্তর্নিহিত কারণ হতে পারে

  1. শূন্যটি মিথ্যা, এটির if(!my_ptr)পরিবর্তে সরাসরি কেউ এটি করতে পারে if(my_ptr==NULL)
  2. নির্বিঘ্নিত গ্লোবাল পূর্ণসংখ্যাগুলি সমস্ত শূন্যগুলিতে ডিফল্টরূপে আরম্ভ হয় এবং সমস্ত শূন্যের এই জাতীয় বিন্দুটিকে অবিচ্ছিন্ন বলে বিবেচনা করা হবে।

এখানে আমি অন্যান্য উত্তরগুলিতে একটি শব্দ বলতে চাই

সিনট্যাকটিক চিনির কারণে নয়

সিনট্যাকটিক চিনির কারণে 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) মনে রাখবেন যে সি অপারেটিং সিস্টেমগুলি লিখতেও ব্যবহৃত হয়, এমনকি সি সংকলকও!

প্রকৃতপক্ষে সিটি ইউএনআইএক্স অপারেটিং সিস্টেমটি এটির সাথে লেখার উদ্দেশ্যে তৈরি করা হয়েছিল এবং এ কারণেই এগুলি ঠিকানা শূন্য থেকে নিজেকে সীমাবদ্ধ রাখার কোনও কারণ বলে মনে হয় না।

(হার্ডওয়্যার) কম্পিউটার কীভাবে হয় তার ব্যাখ্যা (শারীরিকভাবে) ঠিকানা জিরো অ্যাক্সেস করতে সক্ষম

আমি এখানে আরও একটি বিষয় ব্যাখ্যা করতে চাই, ঠিক কীভাবে ঠিকানা শূন্যের উল্লেখ করা সম্ভব?

এক সেকেন্ডের জন্য এটি ভাবুন, ঠিকানাগুলি প্রসেসরের দ্বারা আনা হয় এবং তারপরে মেমোরি বাসে ভোল্টেজ হিসাবে প্রেরণ করা হয় যা মেমোরি সিস্টেম দ্বারা প্রকৃত ঠিকানায় পৌঁছানোর জন্য ব্যবহৃত হয়, এবং শূন্যের কোনও ঠিকানা বলতে কোনও ভোল্টেজের অর্থ হবে না সুতরাং, মেমরি সিস্টেমের শারীরিক হার্ডওয়্যারটি কীভাবে ঠিকানাটি অ্যাক্সেস করতে পারে?

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


1
আমি আপনাকে হ্রাস করি নি তবে আপনার পোস্টে বেশ কয়েকটি সত্যাসত্য ভুল রয়েছে eg অফসেট 0 এ শারীরিক মেমরি অ্যাক্সেস করা অসম্ভব (সমস্ত স্যুইচ বন্ধ থাকার কারণে? সত্যই?), 0 এবং ধ্রুবক 0 বিনিময়যোগ্য (তারা নাও হতে পারে) এবং অন্যান্য।
হস্তুরকুন

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

অবশ্যই ঠিকানার বিট প্যাটার্নটি যা পড়ছে তা নির্বাচন করতে ব্যবহৃত হয়। এটি সাধারণত ক্ষেত্রে হয়। যাইহোক, আমি আপনার সাথে তর্ক করতে চাই না, আমি কেবল ইঙ্গিত করছিলাম কেন আপনি বঞ্চিত হয়েছেন।
হস্তুরকুন

আমি আপনার দাবির সাথে একমত নই আমি এই আলোচনা চালিয়ে যেতে আগ্রহী নই।
হস্তুরকুন

6
হার্ডওয়্যার দাবি বাজে কথা। ঠিকানা শূন্য পড়ার জন্য, ড্রাইভ করুন! চিপটি কম নির্বাচন করুন! যখন বাসটি বন্ধ থাকে, সিএস উচ্চ থাকে!
এমএসএলটাররা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.