কেন পয়েন্টারগুলি ডিফল্টরূপে NULL দিয়ে শুরু করা হয় না?


118

কেউ দয়া করে ব্যাখ্যা করতে পারেন কেন পয়েন্টারগুলি আরম্ভ করা হয় না NULL?
উদাহরণ:

  void test(){
     char *buf;
     if (!buf)
        // whatever
  }

প্রোগ্রামটি যদি bufশূন্য না হয় তবে এটি ভিতরে প্রবেশ করবে না ।

আমি জানতে চাই, কেন, কোন ক্ষেত্রে আমাদের ট্র্যাশযুক্ত একটি পরিবর্তনশীল প্রয়োজন, বিশেষত পয়েন্টারগুলি মেমরিতে ট্র্যাশে সম্বোধন করে?


13
ঠিক আছে, কারণ মৌলিক প্রকারগুলি অবিচ্ছিন্ন করা বাকি রয়েছে। সুতরাং আমি আপনার "আসল" প্রশ্নটি ধরে নিলাম: কেন মৌলিক প্রকারগুলি আরম্ভ করা হয় না?
GManNickG

11
"বুফটি বাতিল না হলে প্রোগ্রামামটি ভিতরে প্রবেশ করবে না"। এটি সঠিক নয়। যেহেতু আপনি জানেন না BUF কি হয় , আপনি কি জানেন না পারেন, তা নয়
ড্রু ডোরম্যান

জাভা এর মতো বিপরীতে, সি ++ বিকাশকারীকে আরও এক টন বেশি দায়িত্ব দেয়।
ষি

আপনি যদি () কনস্ট্রাক্টর ব্যবহার করেন তবে পূর্ণসংখ্যা, পয়েন্টার, 0 এ ডিফল্ট।
এরিক অ্যারোনস্টি

এই ধারণার কারণে যে সি ++ ব্যবহার করা ব্যক্তিরা তারা কী করছে তা জেনে যাচ্ছে, তদুপরি যে কেউ স্মার্ট পয়েন্টারের উপরে কাঁচা পয়েন্টার ব্যবহার করছেন তারা জানেন কি (আরও বেশি) তারা কী করছে!
লম্বা লায়ন

উত্তর:


161

আমরা সকলেই বুঝতে পারি যে পয়েন্টার (এবং অন্যান্য পিওডির ধরণগুলি) শুরু করা উচিত।
প্রশ্নটি তখন 'তাদের আরম্ভ করা উচিত' হয়ে ওঠে।

ওয়েল মূলত দুটি পদ্ধতি আছে:

  • সংকলক তাদের আরম্ভ করে।
  • বিকাশকারী তাদের সূচনা করে।

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

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

এটি শুধু সময়ের কথা নয়। স্থানও। অনেকগুলি পরিবেশ রয়েছে যেখানে উভয় সংস্থানই একটি প্রিমিয়ামে রয়েছে এবং বিকাশকারীরা কোনওটিই ছাড়তে চান না।

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


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

2
আপনি বিস্মিত হবেন যে কেবলমাত্র কেউ তাদের সমস্ত সূচনা সংশোধন করে কতগুলি বাগ এড়ানো হবে। সংকলক সতর্কবার্তা না থাকলে এটি ক্লান্তিকর কাজ হবে।
জনাথন হেনসন

4
@ লোকি, আপনার বক্তব্য অনুসরণ করতে আমার খুব কষ্ট হচ্ছে। আমি কেবল আপনার উত্তরটিকে সহায়ক হিসাবে প্রশংসা করার চেষ্টা করছিলাম, আমি আশা করি আপনি এটি সংগ্রহ করেছিলেন। না হলে আমি দুঃখিত।
জোনাথন হেনসন

3
যদি পয়েন্টারটি প্রথমে NULL তে সেট করা থাকে এবং তারপরে যেকোন মানকে সেট করা হয়, তবে সংকলকটি এটি সনাক্ত করতে সক্ষম হবে এবং প্রথম NULL প্রারম্ভিককরণটি অনুকূল করতে হবে, তাই না?
করচকিডু

1
@ করচকিডু: কখনও কখনও। যদিও প্রধান সমস্যাগুলির মধ্যে একটি হ'ল এটির কোনও সতর্কতার উপায় নেই যে আপনি আপনার সূচনাটি করতে ভুলে গেছেন, কারণ এটি ডিফল্টটি আপনার ব্যবহারের জন্য উপযুক্ত নয় তা জানেন না।
Deduplicator

41

টিসি ++ পিএল (বিশেষ সংস্করণ পি .২২) - তে বর্জন স্ট্রস্ট্রপ উদ্ধৃত করে:

কোনও বৈশিষ্ট্যের প্রয়োগের প্রয়োজন নেই এমন প্রোগ্রামগুলিতে উল্লেখযোগ্য ওভারহেড চাপানো উচিত নয়।


এবং বিকল্পটি দেবেন না, হয়ও। দেখে মনে হচ্ছে
জোনাথন

8
@ জোনাথন কিছুই আপনাকে পয়েন্টার শূন্য করতে - বা সি ++ তে স্ট্যান্ডার্ড হিসাবে 0 করতে বাধা দেয় না।
স্টেফানবি

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

1
এটি সামঞ্জস্যতা ভঙ্গ করে না। ধারণাটি "int * x = __uninitialized" - ডিফল্টরূপে সুরক্ষা, উদ্দেশ্য দ্বারা গতিতে মিলিত হিসাবে বিবেচনা করা হয়েছে।
এমসাল্টাররা

4
আমি কি Dপছন্দ করি। আপনি যদি সূচনা না চান তবে এই সিনট্যাক্সটি ব্যবহার করুন float f = void;বা int* ptr = void;। এখন এটি ডিফল্টরূপে সূচনা করা হয়েছে তবে আপনার যদি সত্যিই প্রয়োজন হয় তবে আপনার এটি করা থেকে সংকলকটি থামাতে পারেন।
deft_code

23

কারণ সূচনাতে সময় লাগে। এবং সি ++ এ, যে কোনও ভেরিয়েবলের সাথে আপনার প্রথমটি করা উচিত তা হ'ল স্পষ্টভাবে সূচনা করা:

int * p = & some_int;

বা:

int * p = 0;

বা:

class A {
   public:
     A() : p( 0 ) {}  // initialise via constructor
   private:
     int * p;
};

1
কে, যদি সূচনাতে সময় লাগে এবং আমি এখনও এটি চাই, তবে কোনওভাবে কীভাবে আমার পয়েন্টারগুলিকে ম্যানুয়ালি সেট না করেই বাতিল করে দেওয়া যায়? দেখুন, কারণ আমি এটি সংশোধন করতে চাই না, কারণ আমি মনে করি যে আমি কখনই তাদের ঠিকানার উপর জঞ্জালযুক্ত পয়েন্টার ব্যবহার করব না
জোনাথন

1
আপনি ক্লাসের কনস্ট্রাক্টরে ক্লাস সদস্যদের সূচনা করুন - সি ++ এভাবেই কাজ করে।

3
@ জোনাথন: তবে নালও ট্র্যাশযুক্ত। নাল পয়েন্টার দিয়ে আপনি দরকারী কিছু করতে পারবেন না। একজনকে ডিফেরেন্ট করা ঠিক ততটাই ত্রুটি। নাল নয়, সঠিক মান সহ পয়েন্টার তৈরি করুন।
ড্রিপজ্জা

2
ন্নুলের কাছে অ্যাপোনিটার শুরু করা একটি বুদ্ধিমান জিনিস হতে পারে nd এবং নাল পয়েন্টারগুলিতে আপনি সম্পাদন করতে পারেন এমন বেশ কয়েকটি অপারেশন রয়েছে - আপনি সেগুলি পরীক্ষা করতে পারেন এবং আপনি সেগুলি মুছতে কল করতে পারেন।

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

20

কারণ সি ++ এর একটি মটোস হ'ল:


আপনি যা ব্যবহার করেন না তার জন্য আপনি অর্থ প্রদান করবেন না


এই খুব কারণে, operator[]এর vectorবর্গ পরীক্ষা না করলে সূচক, সীমানার বাইরে গেছে উদাহরণস্বরূপ।


12

Historicalতিহাসিক কারণে, মূলত কারণ এটি সি তে এটি করা হয় কেন এটি সি এর মতো কেন করা হয়, এটি অন্য একটি প্রশ্ন, তবে আমি মনে করি যে শূন্য ওভারহেড নীতিটি এই নকশার সিদ্ধান্তে কোনওভাবে জড়িত ছিল।


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

8

তদ্ব্যতীত, আপনি যখন এটি ফুটিয়ে তোলেন তার জন্য আমাদের কাছে একটি সতর্কতা রয়েছে: আপনার সংকলকটির উপর নির্ভর করে "সম্ভবত কোনও মান নির্ধারিত হওয়ার আগে ব্যবহৃত হয়" বা অনুরূপ ভার্জেজ।

আপনি সতর্কতা দিয়ে সংকলন করবেন, তাই না?


এবং এটি স্বীকৃতি হিসাবে কেবল সম্ভব যে সংকলনকারীদের ট্রেসিং ত্রুটিযুক্ত হতে পারে।
Deduplicator

6

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

সি ++ সি 98 নয়। জাহান্নাম, এমনকি সি সি নয়। আপনি ঘোষণা এবং কোডটি মিশ্রণ করতে পারেন, সুতরাং আপনার এমন একটি সময় অবধি ঘোষণাকে মুলতুবি করা উচিত যেহেতু আপনার সাথে আরম্ভ করার উপযুক্ত মান নেই।


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

3

পয়েন্টার হ'ল অন্য ধরণের। যদি আপনি একটি int, charবা অন্য কোনও পিওডি টাইপ তৈরি করেন তবে এটি শূন্য থেকে আরম্ভ করা হয়নি, তবে পয়েন্টারটি কেন করা উচিত? যিনি এই জাতীয় প্রোগ্রাম লেখেন তাদের কাছে এটি অপ্রয়োজনীয় ওভারহেড হিসাবে বিবেচিত হতে পারে।

char* pBuf;
if (condition)
{
    pBuf = new char[50];
}
else
{
    pBuf = m_myMember->buf();
}

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


1
অন্যদিকে আপনি চর * পিবুফ = শর্ত করতে পারেন? নতুন চর [50]: m_myMember-> বুফ (); এটি সিনট্যাক্সের ক্ষেত্রে দক্ষতার চেয়ে বেশি তবে আমি তবুও আপনার সাথে একমত হই।
the_drow 22

1
@ থ্রেড্রো: ঠিক আছে, কেউ এটিকে আরও জটিল করে তুলতে পারে যাতে এ জাতীয় পুনর্লিখন সম্ভব হয় না।
Deduplicator

2

আপনি যদি এমন একটি পয়েন্টার চান যা সবসময় NULL- তে শুরু হয়, আপনি সেই কার্যকারিতা অনুকরণ করতে একটি C ++ টেম্পলেট ব্যবহার করতে পারেন:

template<typename T> class InitializedPointer
{
public:
    typedef T       TObj;
    typedef TObj    *PObj;
protected:
    PObj        m_pPointer;

public:
    // Constructors / Destructor
    inline InitializedPointer() { m_pPointer=0; }
    inline InitializedPointer(PObj InPointer) { m_pPointer = InPointer; }
    inline InitializedPointer(const InitializedPointer& oCopy)
    { m_pPointer = oCopy.m_pPointer; }
    inline ~InitializedPointer() { m_pPointer=0; }

    inline PObj GetPointer() const  { return (m_pPointer); }
    inline void SetPointer(PObj InPtr)  { m_pPointer = InPtr; }

    // Operator Overloads
    inline InitializedPointer& operator = (PObj InPtr)
    { SetPointer(InPtr); return(*this); }
    inline InitializedPointer& operator = (const InitializedPointer& InPtr)
    { SetPointer(InPtr.m_pPointer); return(*this); }
    inline PObj operator ->() const { return (m_pPointer); }
    inline TObj &operator *() const { return (*m_pPointer); }

    inline bool operator!=(PObj pOther) const
    { return(m_pPointer!=pOther); }
    inline bool operator==(PObj pOther) const
    { return(m_pPointer==pOther); }
    inline bool operator!=(const InitializedPointer& InPtr) const
    { return(m_pPointer!=InPtr.m_pPointer); }
    inline bool operator==(const InitializedPointer& InPtr) const
    { return(m_pPointer==InPtr.m_pPointer); }

    inline bool operator<=(PObj pOther) const
    { return(m_pPointer<=pOther); }
    inline bool operator>=(PObj pOther) const
    { return(m_pPointer>=pOther); }
    inline bool operator<=(const InitializedPointer& InPtr) const
    { return(m_pPointer<=InPtr.m_pPointer); }
    inline bool operator>=(const InitializedPointer& InPtr) const
    { return(m_pPointer>=InPtr.m_pPointer); }

    inline bool operator<(PObj pOther) const
    { return(m_pPointer<pOther); }
    inline bool operator>(PObj pOther) const
    { return(m_pPointer>pOther); }
    inline bool operator<(const InitializedPointer& InPtr) const
    { return(m_pPointer<InPtr.m_pPointer); }
    inline bool operator>(const InitializedPointer& InPtr) const
    { return(m_pPointer>InPtr.m_pPointer); }
};

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

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

ঠিক আছে সমস্ত তুলনা অপারেটর যুক্ত। ডিফল্ট ওভাররাইডগুলি অপ্রয়োজনীয় হতে পারে তবে তারা এখানে স্পষ্টভাবে এখানে রয়েছে কারণ এটি একটি উদাহরণ।
অ্যাডিসাক

1
আমি বুঝতে পারি না যে এটি কীভাবে সমস্ত পয়েন্টারগুলিকে ম্যানুয়ালি সেট না করে বাতিল করে দেবে, আপনি এখানে কী করেছেন দয়া করে ব্যাখ্যা করতে পারবেন?
জোনাথন

1
@ জোনাথন: এটি মূলত একটি "স্মার্ট পয়েন্টার" যা পয়েন্টারটি বাতিল করে দেওয়া ছাড়া আর কিছুই করে না। এর পরিবর্তে IE Foo *aআপনি ব্যবহার করেন InitializedPointer<Foo> a- Foo *a=0টাইপ করার মতো একটি খাঁটি একাডেমিক অংশ cer তবে উপরের কোডটি শিক্ষামূলক দৃষ্টিকোণ থেকে খুব কার্যকর। কিছুটা পরিবর্তন করে ("প্লেসোল্ডোল্ডিং" কর্টর / ড্টর এবং অ্যাসাইনমেন্ট অপ্সে), এটি সহজেই স্কোপড-পয়েন্টারগুলি (যা ডেস্ট্রাক্টারে ফ্রি থাকে) সহ রেফারেন্স-কাউন্ট-পয়েন্টার সহ বিভিন্ন ধরণের স্মার্ট পয়েন্টারগুলিতে প্রসারিত হতে পারে ইন / m_pPointer সেট বা সাফ হয়ে গেলে ডেস ক্রিয়াকলাপ।
আদিসাক

2

নোট করুন যে স্ট্যাটিক ডেটা 0 তে শুরু করা হয় (যদি না আপনি অন্যথায় বলেন)।

এবং হ্যাঁ, আপনার সর্বদা আপনার ভেরিয়েবলগুলি যতদূর সম্ভব দেরীতে এবং প্রাথমিক মান সহ ঘোষণা করা উচিত। কোড পছন্দ

int j;
char *foo;

আপনি যখন এটি পড়বেন তখন অ্যালার্ম ঘণ্টা বন্ধ করা উচিত। আমি জানি না যে কোনও লিঙ্কগুলি এর সম্পর্কে 100% আইনী হওয়ার পরেও এটি সম্পর্কে কার্প করার জন্য প্ররোচিত হতে পারে।


এটি কি গ্যারান্টিযুক্ত, বা কেবল আজকের সংকলকগণ দ্বারা ব্যবহৃত একটি সাধারণ অনুশীলন?
gha.st

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

1
স্ট্যাটিক ডেটা শূন্যে সূচনা করার বিষয়টি সি এবং সি ++ স্ট্যান্ডার্ড দ্বারা গ্যারান্টিযুক্ত, এটি কেবল সাধারণ অনুশীলন নয়
গ্রুভান্দি

1
সম্ভবত কিছু লোকেরা নিশ্চিত করতে চান যে তাদের স্ট্যাকটি ভালভাবে সাজানো আছে তারা ফাংশনের শীর্ষে সমস্ত ভেরিয়েবলগুলি প্রাক-ঘোষণা করে? হতে পারে তারা এসি উপভাষায় রচনা করছেন যা এটির প্রয়োজন?
কিটসুনওয়াইএমজি

1

আরেকটি সম্ভাব্য কারণ হ'ল লিংক-টাইম পয়েন্টারগুলিতে একটি ঠিকানা দেওয়া হয় তবে পরোক্ষ ঠিকানা / পয়েন্টারকে ডি-রেফারেন্স করা প্রোগ্রামারটির দায়িত্ব of বেশ সাধারণভাবেই, সংকলকটি কম যত্ন করে না, তবে পয়েন্টারগুলি পরিচালনা করতে এবং কোনও স্মৃতি মেমরি ফাঁস না ঘটে তা নিশ্চিত করার জন্য প্রোগ্রামারটির উপর বোঝা চাপানো হয়।

সত্যই, সংক্ষেপে, এগুলি অর্থে সূচনা করা হয় যে লিঙ্ক-টাইমে পয়েন্টার ভেরিয়েবলকে একটি ঠিকানা দেওয়া হয়। উপরে আপনার উদাহরণ কোডে, এটি ক্র্যাশ বা একটি SIGSEGV উত্পন্ন করার গ্যারান্টিযুক্ত।

বুদ্ধিমানের স্বার্থে, সর্বদা NUL- র দিকে পয়েন্টারগুলি সূচনা করুন, সেই পদ্ধতিতে যদি প্রোগ্রামটি ভুল আচরণ করে সে কারণেই যদি প্রোগ্রামারটি এটি ছাড়াই mallocবা অবজ্ঞা করার চেষ্টা করে তবে newসে প্রোগ্রামারকে ক্লু করে ফেলবে।

আশা করি এটি সাহায্য করবে এবং তা উপলব্ধি করবে,


0

ঠিক আছে, যদি সি ++ পয়েন্টারগুলিকে আরম্ভ করে দেয়, তবে "সি ++ সি এর চেয়ে ধীরে ধীরে" অভিযোগ করা সি লোকেরা এগুলিতে ঝুলতে পারে এমন কিছু সত্যই থাকতে পারে;)


এটা আমার কারণ নয়। আমার কারণ হ'ল যদি হার্ডওয়্যারটিতে রম এর 512 বাইট এবং 128 বাইট র‌্যাম থাকে এবং একটি পয়েন্টার শূন্যের অতিরিক্ত নির্দেশ এমনকি একটি বাইটও হয় যা পুরো প্রোগ্রামের বেশ বড় শতাংশ। আমার সেই বাইট দরকার!
জেরি যিরমিয়

0

সি ++ একটি সি ব্যাকগ্রাউন্ড থেকে আসে - এবং এটি থেকে ফিরে আসার কয়েকটি কারণ রয়েছে:

সি, সি ++ এর চেয়েও বেশি হ'ল একটি সংসদীয় ভাষার প্রতিস্থাপন। এটি আপনাকে কিছু করতে বলবে না এমন কিছু করে না। এর জন্য: আপনি যদি এটি করতে চান - এটি করুন!

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


আসলে, সি তে, আপনি যদি সমস্ত শূন্য মেমরি ব্যবহার করতে পারেন তবে বরাদ্দ করতে চান calloc()
ডেভিড থর্নলি

1
শুধু আমার বক্তব্য - আপনি যদি এটি করতে চান তবে আপনি পারেন তবে এটি স্বয়ংক্রিয়ভাবে আপনার জন্য করা হয়নি
gha.st

0

এই পয়েন্টারগুলি আপনি কীসের কথা বলছেন?

ব্যতিক্রম নিরাপত্তার জন্য, সবসময় ব্যবহার auto_ptr, shared_ptr, weak_ptrএবং তাদের অন্যান্য রূপগুলো।
ভাল কোডের একটি হলমার্ক হ'ল এটিতে যে কোনও একক কলকে অন্তর্ভুক্ত করে না delete


3
যেহেতু সি ++ 11, ত্যাগ করুন auto_ptrএবং বিকল্প করুন unique_ptr
Deduplicator

-2

ওহ ছেলে। আসল উত্তরটি হ'ল মেমোরি শূন্য করা সহজ, যা পয়েন্টার বলতে প্রাথমিক সূচনা হয়। যার নিজেও বস্তুটি আরম্ভ করার সাথে কোনও সম্পর্ক নেই।

সতর্কতাগুলি বিবেচনা করে বেশিরভাগ সংকলকরা উচ্চ স্তরে দেয় যা আমি উচ্চ স্তরে প্রোগ্রামিং এবং তাদের ত্রুটি হিসাবে বিবেচনা করতে পারি না। যেহেতু এগুলিকে সরিয়ে দেওয়া কখনও আমাকে বিপুল পরিমাণ কোডের কোড থেকে বাঁচাতে পারেনি আমি এটি সুপারিশ করতে পারি না।


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