সিটিতে পয়েন্টার তুলনা কীভাবে কাজ করে? একই অ্যারেতে নির্দেশ না করে এমন পয়েন্টারগুলির সাথে তুলনা করা কি ঠিক?


33

কে অ্যান্ড আর (সি প্রোগ্রামিং ল্যাঙ্গুয়েজ ২ য় সংস্করণ) অধ্যায়ে আমি নিম্নলিখিতটি পড়েছি:

প্রথমত, পয়েন্টারগুলিকে নির্দিষ্ট পরিস্থিতিতে তুলনা করা যেতে পারে। যদি pএবং qএকই অ্যারের সদস্যদের পয়েন্ট, তারপর সম্পর্ক পছন্দ ==, !=, <, >=সঠিকভাবে, ইত্যাদি হবে।

যা বোঝাচ্ছে যে কেবল একই পয়েন্টারগুলিকে একই অ্যারের দিকে নির্দেশ করছে তা তুলনা করা যেতে পারে।

তবে আমি যখন এই কোডটি চেষ্টা করেছি

    char t = 't';
    char *pt = &t;
    char x = 'x';
    char *px = &x;

    printf("%d\n", pt > px);

1 স্ক্রিনে মুদ্রিত হয়।

প্রথমত, আমি ভেবেছিলাম আমি অপরিজ্ঞাত বা কোনও প্রকার বা ত্রুটি পেয়ে যাব, কারণ ptএবং pxএকই অ্যারেটির দিকে ইঙ্গিত করছে না (অন্তত আমার বোঝার মধ্যে)।

এছাড়াও pt > pxকারণ তাদের উভয়ই পয়েন্টার স্ট্যাকের মধ্যে সংরক্ষিত ভেরিয়েবল প্রতি নির্দেশ করা হয়, এবং স্ট্যাকের নিচে বৃদ্ধি, তাই স্মৃতির ঠিকানা tযে এর চেয়ে বেশী x? কোনটি pt > pxসত্য কেন ?

মলোককে আনা হলে আমি আরও বিভ্রান্ত হয়ে পড়েছি 8..7 অধ্যায়ে কেঅ্যান্ডআর-তেও নিম্নলিখিতটি লেখা আছে:

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

আমার কাছে পয়েন্টারগুলির সাথে তুলনা করার কোনও সমস্যা নেই যা গাদাতে পয়েন্টারগুলিকে স্ট্যাক ভেরিয়েবলগুলিতে নির্দেশিত স্পেস ম্যালসডকে নির্দেশ করে।

উদাহরণস্বরূপ, নিম্নলিখিত কোডটি 1মুদ্রিত হওয়ার সাথে সাথে ভাল কাজ করেছে :

    char t = 't';
    char *pt = &t;
    char *px = malloc(10);
    strcpy(px, pt);
    printf("%d\n", pt > px);

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

তবুও, আমি কে ওআরআরে যা পড়ছি তা নিয়ে আমি বিভ্রান্ত।

আমি জিজ্ঞাসা করার কারণটি হ'ল আমার প্রো। আসলে এটি একটি পরীক্ষার প্রশ্ন করেছে। তিনি নিম্নলিখিত কোডটি দিয়েছেন:

struct A {
    char *p0;
    char *p1;
};

int main(int argc, char **argv) {
    char a = 0;
    char *b = "W";
    char c[] = [ 'L', 'O', 'L', 0 ];

   struct A p[3];
    p[0].p0 = &a;
    p[1].p0 = b;
    p[2].p0 = c;

   for(int i = 0; i < 3; i++) {
        p[i].p1 = malloc(10);
        strcpy(p[i].p1, p[i].p0);
    }
}

এগুলি কী মূল্যায়ন করে:

  1. p[0].p0 < p[0].p1
  2. p[1].p0 < p[1].p1
  3. p[2].p0 < p[2].p1

উত্তর 0, 1এবং 0

(আমার অধ্যাপক পরীক্ষার অস্বীকৃতি অন্তর্ভুক্ত করেছেন যে প্রশ্নগুলি উবুন্টু লিনাক্স 16.04, 64-বিট সংস্করণ প্রোগ্রামিং পরিবেশের জন্য)

(সম্পাদকের দ্রষ্টব্য: যদি এসও আরও বেশি ট্যাগের অনুমতি দেয় তবে তার শেষ অংশটি , এবং সম্ভবত ওয়ারেন্ট দেয় the


17
আপনি হয়তো বিভ্রান্তিকর হয় কি বৈধ মধ্যে Cকি দিয়ে নিরাপদ মধ্যে Cএকই ধরণের সাথে দুটি পয়েন্টারের তুলনা করা সর্বদা করা যায় (উদাহরণ হিসাবে সমতার জন্য পরীক্ষা করা) তবে পয়েন্টার গাণিতিক ব্যবহার করে এবং তুলনা করা হয় >এবং <কেবলমাত্র প্রদত্ত অ্যারে (বা মেমরি ব্লক) এর মধ্যে ব্যবহৃত হলে নিরাপদ থাকে
অ্যাড্রিয়ান মোল

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

5
না, এটি কাজ করার গ্যারান্টিযুক্ত নয়। এটি বিভাগযুক্ত মেমরি মডেল সহ মেশিনগুলিতে অনুশীলনে ব্যর্থ হতে পারে। দেখুন কি সি ++ এর সমমানের স্ট্যান্ড :: কম হবে? বেশিরভাগ আধুনিক মেশিনে, ইউবি হওয়া সত্ত্বেও এটি কাজ করবে।
পিটার কর্ডস

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

3
@ অ্যাডাম: ওহ হ্যাঁ, আমার মন্তব্যের প্রথম অংশটি মনে রাখবেন না, আমি আপনাকে ভুল বুঝেছি। তবে আপনি দাবি করেছেন যে অন্যান্য পয়েন্টারগুলির সাথে তুলনা করা আপনাকে এখনও একটি উত্তর দেবে । এটা সত্যি না. এটি সম্পূর্ণ ইউবি নয়, একটি অনির্ধারিত ফলাফল হবে । ইউবি আরও খারাপ এবং এর অর্থ যদি আপনার প্রোগ্রাম সেগফল্ট বা সিগিল হয়ে উঠতে পারে যদি কার্যকরভাবে সেই ইনপুটগুলির সাথে বিবৃতি পৌঁছায় (এর আগে বা পরে যে কোনও মুহূর্তে আসলে ঘটে)। (সংকলনের সময় যদি ইউবি দৃশ্যমান হয় তবে কেবলমাত্র x86-64 এ উপলব্ধিযোগ্য anything
পিটার

উত্তর:


33

মতে C11 মান , রিলেশনাল অপারেটর <, <=, >, এবং >=শুধুমাত্র পয়েন্টার একই বিন্যাস বা struct হয় বস্তুর উপাদান ব্যবহৃত হতে পারে। এটি 6.5.8p5 বিভাগে বর্ণিত হয়েছে:

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

নোট করুন যে কোনও তুলনা যা এই প্রয়োজনীয়তা পূরণ করে না তা অপরিজ্ঞাত আচরণের জন্য আহ্বান করে , যার অর্থ (অন্যান্য জিনিসগুলির মধ্যে) যে আপনি ফলাফলগুলি পুনরাবৃত্ত হতে পারে তার উপর নির্ভর করতে পারবেন না।

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

উদাহরণস্বরূপ, 8086 রিয়েল মোডে চলমান একটি x86 প্রসেসরের একটি 20-বিট ঠিকানা তৈরি করতে 16 বিট বিভাগ এবং 16-বিট অফসেট ব্যবহার করে একটি বিভাগযুক্ত মেমরি মডেল রয়েছে। সুতরাং এই ক্ষেত্রে কোনও ঠিকানা কোনও পূর্ণসংখ্যার সাথে হুবহু রূপান্তর করে না।

সমতা অপারেটর ==এবং !=তবে এই সীমাবদ্ধতা নেই। এগুলি যে কোনও দুটি পয়েন্টারের সাথে সামঞ্জস্যপূর্ণ প্রকার বা NULL পয়েন্টারগুলির মধ্যে ব্যবহার করা যেতে পারে। সুতরাং আপনার উভয় উদাহরণ ব্যবহার ==বা ব্যবহার করে !=বৈধ সি কোড তৈরি হবে।

যাইহোক, এমনকি ==এবং !=আপনি কিছু অপ্রত্যাশিত এখনও এখনও সঠিকভাবে সংজ্ঞায়িত ফলাফল পেতে পারেন। দেখুন সম্পর্কযুক্ত পয়েন্টারের সমতার তুলনা কি সত্যকে মূল্যায়ন করতে পারে? এই সম্পর্কে আরও তথ্যের জন্য।

আপনার অধ্যাপক প্রদত্ত পরীক্ষার প্রশ্ন সম্পর্কে, এটি অনেকগুলি ত্রুটিযুক্ত অনুমান করে:

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

আপনি যদি এই কোডটি কোনও আর্কিটেকচারে এবং / অথবা একটি সংকলক সহ চালনা করে যা এই অনুমানগুলি পূরণ করে না তবে আপনি খুব আলাদা ফলাফল পেতে পারেন।

এছাড়াও, উভয় strcpyউদাহরণই কল করার সময় অপরিজ্ঞিত আচরণ প্রদর্শন করে , যেহেতু ডান অপারেণ্ড (কিছু ক্ষেত্রে) একটি একক চরিত্রকে নির্দেশ করে এবং নাল টার্মিনেটেড স্ট্রিংকে নয়, ফলস্বরূপ প্রদত্ত ভেরিয়েবলের সীমানা পেরিয়ে যায়।


3
@ শিসুই এমনকি তা দেওয়া হলেও, আপনার ফলাফলের উপর নির্ভর করা উচিত নয়। অপ্টিমাইজেশনের ক্ষেত্রে কম্পাইলাররা খুব আক্রমণাত্মক হয়ে উঠতে পারে এবং এটি করার সুযোগ হিসাবে অপরিজ্ঞাত আচরণ ব্যবহার করবে। এটি সম্ভব যে কোনও পৃথক সংকলক এবং / অথবা বিভিন্ন অপ্টিমাইজেশন সেটিংস ব্যবহার করে বিভিন্ন আউটপুট তৈরি করা যায়।
dbush

2
@ শিসুই: এটি সাধারণভাবে x86-64 এর মতো ফ্ল্যাট মেমরির মডেলযুক্ত মেশিনগুলিতে কাজ করতে ঘটবে। এই জাতীয় সিস্টেমগুলির জন্য কিছু সংকলক এমনকি তাদের ডকুমেন্টেশনে আচরণের সংজ্ঞা দিতে পারে। তবে তা না হলে সংকলন-সময়-দৃশ্যমান ইউবির কারণে "উন্মাদ" আচরণটি ঘটতে পারে। (অনুশীলনে আমি মনে করি না যে কেউ এটি চায় তাই এটি মূলধারার সংকলকগুলির মতো কিছু না এবং "ভাঙার চেষ্টা করুন"))
পিটার

1
ভালো লেগেছে একটি কম্পাইলার দেখে সঞ্চালনের এক পথ হতে হবে <মধ্যে mallocফলাফলের এবং একটি স্থানীয় পরিবর্তনশীল (স্বয়ংক্রিয় স্টোরেজ, অর্থাত স্ট্যাক), এটা মৃত্যুদণ্ড সেই পথ অনুমান করা হতে পারে কখনো নেওয়া হয় এবং শুধুমাত্র একটি পুরো ফাংশন কম্পাইল ud2নির্দেশ (একটি অবৈধ উত্থাপন -নির্মাণের ব্যতিক্রম যা কার্নেল প্রক্রিয়াটিতে একটি সিগিল সরবরাহ করে পরিচালনা করবে)। জিসিসি / ক্ল্যাংটি অন্য ধরণের ইউবির ক্ষেত্রে অনুশীলনে এটি করুন, যেমন কোনও অ- voidকার্যকারিতা শেষ হয়ে যাওয়া । Godbolt.org ঠিক এখন মনে হচ্ছে নিচে, তবে অনুলিপি / আটকানোর চেষ্টা করুন int foo(){int x=2;}এবং একটির অভাবটি নোট করুনret
পিটার

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

2
@ পিটারকর্ডস: যা প্রয়োজন তা হ'ল আচরণের বিভিন্ন দিককে "allyচ্ছিকভাবে সংজ্ঞায়িত" হিসাবে চিহ্নিত করা, যেমন বাস্তবায়নগুলি তাদের অবসর সময়ে তাদের সংজ্ঞা দেয় বা না পারে, তবে তারা যদি এটি না করে তবে পরীক্ষামূলক ফ্যাশনে (যেমন পূর্বনির্ধারিত ম্যাক্রো) নির্দেশ করতে হবে। তদ্ব্যতীত, অপ্টিমাইজেশনের প্রভাবগুলি "অপরিজ্ঞাত আচরণ" হিসাবে পর্যবেক্ষণযোগ্য যে কোনও পরিস্থিতিতে চিহ্নিত করার পরিবর্তে এটি আরও বেশি কার্যকর হবে যে অপটিমাইজাররা আচরণের নির্দিষ্ট দিকগুলিকে "অ-পর্যবেক্ষণযোগ্য" হিসাবে বিবেচনা করতে পারে যদি তারা নির্দেশ করে যে তারা তাই করো. উদাহরণস্বরূপ, প্রদত্ত int x,y;, একটি বাস্তবায়ন ...
সুপারক্যাট

12

একই ধরণের দুটি স্বতন্ত্র অ্যারের সাথে পয়েন্টারগুলির সাথে তুলনা করার প্রাথমিক সমস্যাটি হ'ল অ্যারেগুলি তাদের নির্দিষ্ট কোনও আপেক্ষিক অবস্থানে স্থাপন করার দরকার নেই - একটির অপরটির আগে এবং পরে শেষ হতে পারে।

প্রথমত, আমি ভেবেছিলাম আমি অপরিজ্ঞাত বা কোনও প্রকার বা ত্রুটি পেয়ে যাব, কারণ pt px একই অ্যারেটির দিকে নির্দেশ করছে না (অন্তত আমার বোঝার মধ্যে)।

না, ফলাফল বাস্তবায়ন এবং অন্যান্য অনির্দেশ্য কারণের উপর নির্ভরশীল।

পিটি> পিক্সও কারণ উভয় পয়েন্টার স্ট্যাকের মধ্যে সঞ্চিত ভেরিয়েবলগুলিকে নির্দেশ করছে এবং স্ট্যাকটি নীচে বৃদ্ধি পায়, তাই টি এর মেমরি ঠিকানাটি x এর চেয়ে বেশি? Pt> px কোনটি সত্য?

অগত্যা একটি স্ট্যাক নেই । যখন এটি বিদ্যমান তখন এটি বাড়ার দরকার নেই। এটি বড় হতে পারে। এটি কিছু উদ্ভট উপায়ে সংঘবদ্ধ হতে পারে।

তদুপরি, আমি মনে করি দুটি পয়েন্টারের মধ্যে পয়েন্টার গাণিতিক ভাল, তারা পৃথকভাবে যেখানে নির্দেশ করবে তা বিবেচনাধীন নয় কারণ পাটিগণিত কেবল পয়েন্টার স্টোরকে মেমরি ঠিকানার ঠিকানা ব্যবহার করে।

আসুন 85 পৃষ্ঠায় সি স্পেসিফিকেশনটি দেখুন relation6.5.8 যা সম্পর্কিত অপারেটরগুলি (যেমন আপনি তুলনা অপারেটরগুলি ব্যবহার করছেন) আলোচনা করে। মনে রাখবেন যে এটি সরাসরি !=বা ==তুলনা প্রযোজ্য নয় ।

যখন দুটি পয়েন্টার তুলনা করা হয়, ফলাফলটি নির্দেশিত বস্তুর ঠিকানার স্থানের তুলনামূলক অবস্থানের উপর নির্ভর করে। ... যদি অবজেক্টগুলি একই সমষ্টিগত বস্তুর সদস্য হয় ... ... বৃহত্তর সাবস্ক্রিপ্ট মানগুলির সাথে অ্যারের উপাদানগুলিকে পয়েন্টারগুলি নিম্ন সাবস্ক্রিপ্ট মানগুলির সাথে একই অ্যারের উপাদানের সাথে পয়েন্টারগুলির চেয়ে বেশি তুলনা করে।

অন্য সমস্ত ক্ষেত্রে, আচরণটি সংজ্ঞায়িত।

শেষ বাক্যটি গুরুত্বপূর্ণ। স্থান বাঁচাতে আমি কিছু অপ্রাসঙ্গিক কেস কেটে দিই, এমন একটি ক্ষেত্রে আমাদের কাছে গুরুত্বপূর্ণ: দুটি অ্যারে, একই স্ট্রাক্ট / সমষ্টিগত বস্তুর 1 এর অংশ নয় , এবং আমরা সেই দুটি অ্যারের সাথে পয়েন্টার তুলনা করছি। এটি অনির্ধারিত আচরণ

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

1 একই কাঠামোর অংশ হিসাবে দুটি পৃথক অ্যারেতে নির্দেশককে তুলনা করা যেতে পারে, যেহেতু এটি এই ধারাটির অধীনে যেখানে দুটি অ্যারে একই সমষ্টিগত বস্তুর (স্ট্রাক্ট) অংশ part


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

1
আপনার সংকলক দৃশ্যমান পার্শ্ব প্রতিক্রিয়াগুলি সহ পুরো ফাংশনটিকে অপ্টিমাইজ করতে পারে কোনও অত্যুক্তি নয়: অন্যান্য ধরণের ইউবির জন্য (যেমন কোনও অ- voidকার্যকারিতা শেষে পড়ে যাওয়া ) জি ++ এবং ঝনঝন ++ বাস্তবে বাস্তবে এটি করে: Godbolt.org/z/g5vesB তারা ধরে নিন যে মৃত্যুদন্ড কার্যকর করার পথটি নেওয়া হয়নি কারণ এটি ইউবির দিকে পরিচালিত করে, এবং এই জাতীয় কোনও ব্লককে একটি অবৈধ নির্দেশের জন্য সংকলন করে। বা কোনও নির্দেশের বিন্দুমাত্র নয়, যদি সেই ফাংশনটি কখনও ডাকা হত তবে নিঃশব্দে পরবর্তী যে কোনও asm রয়েছে তার মধ্যে পড়ুন। (কোনও কারণে gccএটি না করে, কেবল g++)।
পিটার

6

তারপরে কী জিজ্ঞাসা করলেন

p[0].p0 < p[0].p1
p[1].p0 < p[1].p1
p[2].p0 < p[2].p1

মূল্যায়ন। উত্তর 0, 1, এবং 0 হয়।

এই প্রশ্নগুলি হ্রাস:

  1. স্ট্যাকের উপরে বা তার নীচে heগল।
  2. প্রোগ্রামটির স্ট্রিং আক্ষরিক অংশের উপরে বা নীচে স্তূপটি।
  3. [1] হিসাবে একই।

এবং তিনটিরই উত্তর "বাস্তবায়ন সংজ্ঞায়িত"। আপনার প্রোফেসরের প্রশ্নগুলি বোগাস; তারা এটিকে traditionalতিহ্যবাহী ইউনিক্স লেআউটে ভিত্তি করে তৈরি করেছে:

<empty>
text
rodata
rwdata
bss
< empty, used for heap >
...
stack
kernel

তবে বেশ কয়েকটি আধুনিক ইউনিসে (এবং বিকল্প সিস্টেমগুলি) traditionsতিহ্যের সাথে সম্মতি দেয় না। যদি না তারা "1992 সালের হিসাবে" এই প্রশ্নের উপস্থাপনা না করে; খোলার উপর একটি -1 দিতে ভুলবেন না


3
বাস্তবায়ন সংজ্ঞায়িত নয়, অপরিজ্ঞাত! এটিকে এভাবে ভাবুন, বাস্তবায়নগুলির মধ্যে পূর্বেরটির মধ্যে ভিন্নতা থাকতে পারে তবে বাস্তবায়নগুলি কীভাবে আচরণের সিদ্ধান্ত নেওয়া হয় তা নথিভুক্ত করা উচিত। দ্বিতীয়টির অর্থ আচরণটি যে কোনও উপায়ে পরিবর্তিত হতে পারে এবং বাস্তবায়নের জন্য আপনাকে স্কোয়াট বলতে হবে না :-)
প্যাক্সিডিয়াবল

1
@ প্যাক্সিয়াব্লো: স্ট্যান্ডার্ডের লেখকদের রেশনাল অনুসারে, "অপরিজ্ঞাত আচরণ ... সম্ভাব্য অনুসারে ভাষা বর্ধনের ক্ষেত্রগুলিও চিহ্নিত করে: বাস্তবায়নকারী আনুষ্ঠানিকভাবে অপরিবর্তিত আচরণের সংজ্ঞা প্রদান করে ভাষাটিকে বাড়িয়ে তুলতে পারে।" রেশনেল আরও বলেছে, "লক্ষ্যটি হ'ল প্রোগ্রামারকে শক্তিশালী সি প্রোগ্রাম তৈরি করার লড়াইয়ের সুযোগ দেওয়া, যা বহনযোগ্য না হওয়ার মতো পুরোপুরি দরকারী সি প্রোগ্রামকে মনে করে না দেখায়, সুতরাং এডভারবটি কঠোরভাবে হয়।" বাণিজ্যিক সংকলক লেখকগণ এটি বুঝতে পারেন তবে কিছু অন্যান্য সংকলক লেখক তা বোঝেন না।
সুপারক্যাট

আরও একটি বাস্তবায়ন সংজ্ঞায়িত দিক আছে; পয়েন্টার তুলনা স্বাক্ষরিত , সুতরাং মেশিন / ওএস / সংকলক উপর নির্ভর করে কিছু ঠিকানা নেতিবাচক হিসাবে ব্যাখ্যা করা যেতে পারে। উদাহরণস্বরূপ, একটি 32 বিট মেশিন যে 0xc << 28 এ স্ট্যাক রেখেছিল, সম্ভবত হিপ বা রডাটার চেয়ে কম ঠিকানাতে স্বয়ংক্রিয় ভেরিয়েবলগুলি দেখায়।
mevets

1
@ মেমভেটস: স্ট্যান্ডার্ড কি এমন কোনও পরিস্থিতি নির্দিষ্ট করে যেখানে তুলনায় পয়েন্টারের স্বাক্ষর পর্যবেক্ষণযোগ্য হবে? আমি প্রত্যাশা করব যে যদি কোনও 16-বিট প্ল্যাটফর্মটি 32768 বাইটের চেয়ে বেশি অবজেক্টগুলিকে মঞ্জুরি দেয় এবং arr[]এমন একটি বস্তু ,,, স্ট্যান্ডার্ড আদেশ দেয় যে একটি স্বাক্ষরিত পয়েন্টার তুলনা অন্যথায় রিপোর্ট করেও তার arr+32768চেয়ে বেশি arrতুলনা করে।
সুপারক্যাট

আমি জানি না; সি স্ট্যান্ডার্ডটি দান্তের নবম বৃত্তে প্রদক্ষিণ করছে, ইচ্ছেথার জন্য প্রার্থনা করছে। ওপি বিশেষত কেঅ্যান্ডআর এবং একটি পরীক্ষার প্রশ্ন উল্লেখ করেছে। #Ub একটি অলস ওয়ার্কিং গ্রুপ থেকে ধ্বংসাবশেষ।
mevets

1

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

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

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

এমন একটি পরিস্থিতির উদাহরণ হিসাবে যেখানে সাম্যতা তুলনা জিসিসি এবং ঝনঝনিতে সংবেদনহীন আচরণ করে, বিবেচনা করুন:

extern int x[],y[];
int test(int i)
{
    int *p = y+i;
    y[0] = 4;
    if (p == x+10)
        *p = 1;
    return y[0];
}

ক্ল্যাং এবং জিসিসি উভয়ই কোড উত্পন্ন করবে যা সর্বদা xদশটি উপাদান হয়ে গেলেও 4 ফিরে আসবে , yতাত্ক্ষণিকভাবে এটি অনুসরণ করে এবং iশূন্যের ফলে তুলনাটি সত্য এবং p[0]মান 1 দিয়ে লেখা হচ্ছে ফলাফল আমি মনে করি যা ঘটেছিল তা হ'ল অপটিমাইজেশনের একটি পাস আবার লিখেছিল ফাংশন যেমন হিসাবে *p = 1;প্রতিস্থাপিত হয়েছে x[10] = 1;। যদি কম্পাইলার ব্যাখ্যা আধুনিক কোড সমতুল্য হবে *(x+10)সমতূল্য হিসেবে *(y+i), কিন্তু দুর্ভাগ্যবশত একটি স্রোতবরাবর অপ্টিমাইজেশান পর্যায় স্বীকার যে একটি অ্যাক্সেস x[10]শুধুমাত্র যদি সংজ্ঞায়িত হবে xঅন্তত 11 উপাদান, যা এটা অসম্ভব প্রভাবিত করার যে অ্যাক্সেসের জন্য করতে হবে ছিল y

যদি সংকলকগণ স্ট্যান্ডার্ড দ্বারা বর্ণিত পয়েন্টার সমতার দৃশ্যের সাথে সেই "ক্রিয়েটিভ" পেতে পারেন তবে স্ট্যান্ডার্ড প্রয়োজনীয়তা আরোপ না করে এমন ক্ষেত্রে আরও সৃজনশীল হওয়া থেকে বিরত থাকতে আমি তাদের বিশ্বাস করব না।


0

এটি সহজ: পয়েন্টারগুলির সাথে তুলনা করা অর্থবোধ করে না কারণ বস্তুগুলির জন্য মেমরির অবস্থানগুলি কখনই আপনার ঘোষিত হিসাবে একই ক্রমে থাকার গ্যারান্টিযুক্ত হয় না। ব্যতিক্রম অ্যারে হয়। & অ্যারে [0] & অ্যারে [1] এর চেয়ে কম। কেএন্ডআর কী দেখায় তা স্থির করে। অনুশীলনে কাঠামোর সদস্যের ঠিকানাগুলি আমার অভিজ্ঞতা অনুসারে সেগুলি ঘোষণা করার ক্রমেও রয়েছে। এটির কোনও গ্যারান্টি নেই .... আপনি যদি সমতার জন্য কোনও পয়েন্টারের তুলনা করেন তবে আর একটি ব্যতিক্রম। যখন একটি পয়েন্টার অন্যটির সমান হয় আপনি জানেন যে এটি একই বস্তুর দিকে নির্দেশ করছে। এটা যাই হোক না কেন. খারাপ জিজ্ঞাসা প্রশ্ন যদি আপনি আমাকে জিজ্ঞাসা। উবুন্টু লিনাক্স 16.04 এর উপর নির্ভর করে, কোনও পরীক্ষার প্রশ্নের জন্য 64-বিট সংস্করণ প্রোগ্রামিং পরিবেশ? সত্যি?


টেকনিক্যালি, অ্যারে নয় সত্যিই একটি ব্যতিক্রম যেহেতু আপনি ঘোষণা করছে না arr[0], arr[1]ইত্যাদি আলাদাভাবে। আপনি সম্পূর্ণরূপে ঘোষণা arrকরেন যাতে স্বতন্ত্র অ্যারে উপাদানগুলির ক্রম এই প্রশ্নটিতে বর্ণিত একটি আলাদা সমস্যা।
প্যাক্সিডিয়াবলো

1
কাঠামোর উপাদানগুলি যথাযথভাবে গ্যারান্টিযুক্ত, যা গ্যারান্টি দেয় যে কেউ memcpyকোনও কাঠামোর একটি সামঞ্জস্যপূর্ণ অংশ অনুলিপি করতে এবং এতে সমস্ত উপাদানকে প্রভাবিত করতে এবং অন্য কোনও কিছুকে প্রভাবিত করতে পারে না। স্ট্রাকচারগুলি বা malloc()বরাদ্দকৃত স্টোরেজ দিয়ে কী ধরণের পয়েন্টার পাটিগণিত করা যায় তা সম্পর্কে স্ট্যান্ডার্ডটি পরিভাষা সম্পর্কে slালু । offsetofম্যাক্রো বরং অকাজের যদি এক পারা একটি মত একটি struct বাইট সঙ্গে পয়েন্টার এরিথমেটিক একই ধরনের হবে না char[], কিন্তু স্ট্যান্ডার্ড স্পষ্টভাবে বলে না যে একটি struct বাইট হয় (অথবা হিসাবে ব্যবহার করা যেতে পারে) একটি অ্যারে অবজেক্ট
সুপারক্যাট

-4

কী উস্কানিমূলক প্রশ্ন!

এমনকি এই থ্রেডের প্রতিক্রিয়া এবং মন্তব্যের কুফরী স্ক্যানিং আপনার আপাতদৃষ্টিতে সহজ এবং সরল ফরওয়ার্ড ক্যোয়ারীটি কতটা আবেগময় তা প্রকাশ করবে ।

এটি অবাক করা উচিত নয়।

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

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

নীতির অন্তর্নিহিত গভীরভাবে ডেভেলপিং, অতএব হওয়া আবশ্যক প্রাসঙ্গিক করার যে ব্যক্তি যে aspires করার শ্রেষ্ঠত্ব বিশেষত সিস্টেম পর্যায়ে - প্রোগ্রামিং

আমি ধারণা করি এটি আপনার শিক্ষকের অর্থ প্রদর্শন করার জন্য ঠিক কী।

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

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

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

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

সংক্ষেপে, আপনার প্রশ্নের উত্তর চমত্কারভাবে সহজ এবং সন্তোষজনক মিষ্টি - আপনার সন্দেহের নিশ্চিতকরণে। তবে প্রদত্ত যে কোনও একটি প্রয়োজনীয় তাত্পর্যপূর্ণ করে এই বিবৃতিতে প্রতিটি ধারণার জন্য করে :

  • পয়েন্টারগুলি পরীক্ষা করা, তুলনা করা এবং পরিচালনা করার কাজগুলি সর্বদা এবং প্রয়োজনীয়ভাবে হয় বৈধ হয়, যখন ফলাফল থেকে প্রাপ্ত সিদ্ধান্তগুলি প্রাপ্ত মানগুলির বৈধতার উপর নির্ভর করে এবং তাই এটির প্রয়োজন হয় না

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

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

আপনি বেশ সঠিকভাবে আছে surmised হয়েছে,

আমাকে ভাবতে পরিচালিত করা হচ্ছে যে কোনও পয়েন্টারকে অন্য যে কোনও পয়েন্টারের সাথে তুলনা করা যেতে পারে, তারা পৃথকভাবে কোথায় নির্দেশ করে তা নির্বিশেষে। তদুপরি, আমি মনে করি দুটি পয়েন্টারের মধ্যে পয়েন্টার গাণিতিক ভাল, তারা পৃথকভাবে যেখানে নির্দেশ করবে তা বিবেচনাধীন নয় কারণ পাটিগণিত কেবল পয়েন্টার স্টোরকে মেমরি ঠিকানার ঠিকানা ব্যবহার করে।

এবং বেশ কয়েকটি অবদানকারী নিশ্চিত করেছেন: পয়েন্টারগুলি কেবল সংখ্যা। কখনও কখনও জটিল সংখ্যার কাছাকাছি কিছু , তবে এখনও সংখ্যার চেয়ে বেশি কিছু নয়।

মজাদার ঘটনা যা এখানে এই বিতর্কটি পেয়েছে তা প্রোগ্রামিংয়ের চেয়ে মানব প্রকৃতি সম্পর্কে আরও বেশি প্রকাশ করে তবে তা নোট এবং বিস্তৃত হওয়ার যোগ্য। সম্ভবত আমরা পরে এটি করব ...

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

যে শেষ দিকে, আমরা প্রথম প্রয়োজন তারিফ অবিকল কি পয়েন্টার হয়

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

যেমনটি অনেকে উল্লেখ করেছেন: শব্দ পয়েন্টারটি কেবল একটি সূচক যা কেবল একটি সূচক জন্য একটি বিশেষ নাম , এবং এইভাবে অন্য সংখ্যা ছাড়া আর কিছুই নয়

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

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

  • একটি সমতল মেমরির মডেলটিতে: পুরো সিস্টেমের স্মৃতি একক, লিনিয়ার ক্রমে সংগঠিত হয়: শহরের সমস্ত বাড়ি একই রাস্তায় অবস্থিত, এবং প্রতিটি ঘর এককভাবে তার সংখ্যা দ্বারা চিহ্নিত করা হয়। আনন্দদায়ক সহজ।

  • ইন segmented স্কিম: সংখ্যাযুক্ত রাস্তা একটি হায়ারারকিকাল প্রতিষ্ঠানের সংখ্যা ঘর যাতে যৌগিক ঠিকানাগুলি প্রয়োজন হয় যে উপরোক্ত আবির্ভাব ঘটে।

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

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

আমাদের এই কাল্পনিক শহরে ডাক কর্মীরা অনেকটা 'বাস্তব' বিশ্বে আমরা দেখতে পাই। আপনি যখন কোনও অবৈধ ঠিকানা সম্পর্কে কথা বলছেন বা খোঁজখবর নেবেন তখন কেউ স্ট্রোকের ঝুঁকিতে পড়বেন না, তবে আপনি যখন তাদের সেই তথ্যটিতে কাজ করতে বলবেন তখন সর্বশেষের লোকজন ঝাঁকুনি খাবেন ।

মনে করুন আমাদের একক রাস্তায় 20 টি বাড়ি রয়েছে houses আরও ভান করুন যে কিছু পথভ্রষ্ট, বা ডিসলেক্সিক আত্মা একটি চিঠি, খুব গুরুত্বপূর্ণ একটিকে 71১ নম্বরে পরিচালিত করেছে। এখন, আমরা আমাদের ক্যারিয়ার ফ্র্যাঙ্ককে জিজ্ঞাসা করতে পারি, এমন ঠিকানা আছে কিনা, এবং তিনি কেবল এবং শান্তভাবে রিপোর্ট করবেন: না । আমরা এমনকি তাকে অনুমান করার জন্য কতদূর রাস্তায় বাহিরে এই অবস্থানটি যদি এটা মিথ্যা বলব আশা করতে পারেন করেনি শেষ চেয়ে আরও মোটামুটিভাবে 2.5 সময়: বিদ্যমান। এর কোনোটাই তাকে কোনও হতাশার কারণ করে না। তবে, আমরা যদি তাকে এই চিঠিটি সরবরাহ করতে বলি , বা সেই জায়গা থেকে কোনও জিনিস তুলতে চাইছি, তবে তিনি সম্ভবত তার অসন্তুষ্টি সম্পর্কে বেশ স্পষ্ট , এবং তা মানতে অস্বীকার করবেন।

পয়েন্টারগুলি কেবল ঠিকানা, এবং ঠিকানাগুলি কেবল সংখ্যা।

নিম্নলিখিতগুলির আউটপুট যাচাই করুন:

void foo( void *p ) {
   printf(“%p\t%zu\t%d\n”, p, (size_t)p, p == (size_t)p);
}

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

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

  • আমরা কেবল স্বচ্ছতার স্বার্থে result স্পষ্টভাবে গণনা করছি , এবং এটি মুদ্রণ করে সংকলককে অন্যথায় কীভাবে বেহাল, মৃত কোড বলে গণনা করতে বাধ্য করে।
void foo( size_t *a, size_t *b ) {
   size_t result;
   result = (size_t)a;
   printf(“%zu\n”, result);
   result = a == b;
   printf(“%zu\n”, result);
   result = a < b;
   printf(“%zu\n”, result);
   result = a - b;
   printf(“%zu\n”, result);
}

অবশ্যই, পরীক্ষাটি করার সময় যখন a বা b অপরিজ্ঞাত (পড়ুন: সঠিকভাবে আরম্ভ করা হয়নি ) করা হয় তখন প্রোগ্রামটি দুর্গঠিত হয় তবে এটি আমাদের আলোচনার এই অংশের সাথে একেবারেই অপ্রাসঙ্গিক । এই স্নিপেটগুলিও নীচের বিবৃতিগুলির গ্যারান্টিযুক্ত - 'স্ট্যান্ডার্ড' দ্বারা - নির্বিঘ্নে সংকলন করতে এবং চালিত করার জন্য , এতে জড়িত কোনও পয়েন্টারের ইন- ওয়ালিডিটি সত্ত্বেও ।

সমস্যাগুলি কেবল তখনই উদ্ভূত হয় যখন কোনও অবৈধ পয়েন্টারটিকে অবনমিত করা হয় । আমরা যখন ফ্রাঙ্ককে অবৈধ, অস্তিত্বহীন ঠিকানা বাছাই বা বিতরণ করতে বলি।

যেকোন নির্বিচার পয়েন্টার দেওয়া:

int *p;

যদিও এই বিবৃতিটি সংকলন এবং চালাতে হবে:

printf(“%p”, p);

... এটি অবশ্যই:

size_t foo( int *p ) { return (size_t)p; }

... দুই নিম্নলিখিত, একেবারে বিপরীত, এখনও নির্দ্ধিধায় কম্পাইল হবে, কিন্তু ব্যর্থ সম্পাদনের যদি না পয়েন্টার হয় বৈধ - যার দ্বারা আমরা এখানে নিছক অর্থ এটা যে একটি ঠিকানা যা বর্তমান আবেদন অ্যাক্সেস মঞ্জুর করা হয়েছে রেফারেন্স :

printf(“%p”, *p);
size_t foo( int *p ) { return *p; }

কত সূক্ষ্ম পরিবর্তন? যা - পয়েন্টার মান মধ্যে পার্থক্য মধ্যে পার্থক্য মিথ্যা হয় যে নম্বরে বাড়ির: ঠিকানা, এবং বিষয়বস্তুর মান। কোন সমস্যা নেই দেখা দেয় দুটো কারণে পর্যন্ত পয়েন্টার dereferenced ; ঠিকানাটিতে প্রবেশ করার চেষ্টা করা পর্যন্ত এটি লিঙ্ক করে। রাস্তার প্রসারিত ছাড়িয়ে প্যাকেজটি সরবরাহ বা তুলে নেওয়ার চেষ্টা করে ...

এক্সটেনশন দ্বারা, একই নীতি অগত্যা উপরোক্ত সহ আরো জটিল উদাহরণ, প্রযোজ্য প্রয়োজন থেকে স্থাপন প্রয়োজনীয় মেয়াদ:

int* validate( int *p, int *head, int *tail ) { 
    return p >= head && p <= tail ? p : NULL; 
}

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

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

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

আপনি , প্রোগ্রামার হিসাবে,যেমন জ্ঞান থাকতে পারে! এবং কিছু ক্ষেত্রে এটি কাজে লাগাতে বাধ্য।

সেখানে রয়েছি তাই পরিস্থিতি যা এমনকি এই সম্পূর্ণভাবে হয় বৈধ এবং পুরোপুরি সঠিক।

আসলে, এটা ঠিক কি mallocনিজেই অভ্যন্তরীণভাবে করতে যখন সময় উদ্ধারকৃত ব্লক মার্জ চেষ্টা আসে আছে - আর্কিটেকচারের বেশীরভাগ উপর। অপারেটিং সিস্টেমের বরাদ্দকারীর ক্ষেত্রেও এটি একই, একই মত sbrk; যদি আরও স্পষ্টতই , ঘন ঘন , আরও স্বতন্ত্র সত্তাগুলির উপর, আরও সমালোচনামূলকভাবে - এবং এমন প্ল্যাটফর্মগুলিতেও প্রাসঙ্গিক যেখানে এটি mallocনাও হতে পারে। এবং কিভাবে তাদের অনেককেই হয় না সি লিখিত?

কোনও ক্রিয়াকলাপের বৈধতা, সুরক্ষা এবং সাফল্য অনিবার্যভাবে অন্তর্দৃষ্টির স্তরের ফলাফল যা এটি ভিত্তি করে প্রয়োগ করা হয় এবং প্রয়োগ করা হয়।

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

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

বাস্তবে, এটি কেবলমাত্র বলে: 'এই বিষয়টির বাইরে, কাউবয় : আপনি নিজেরাই আছেন ...'

আপনার অধ্যাপক আপনাকে সূক্ষ্ম সূক্ষ্মতা প্রদর্শন করতে চাইছেন ।

কি মহান যত্ন লক্ষ্য করুনতারা উদাহরণস্বরূপ কারুকার্য তৈরি করতে তারা নিয়েছে ; এবং এটি এখনও কতটা ভঙ্গুর । এর ঠিকানা নিয়ে , ইনa

p[0].p0 = &a;

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

কেবল এই লাইনটি পরিবর্তন করা হচ্ছে:

char a = 0;

এটি:

char a = 1;  // or ANY other value than 0

প্রোগ্রামের আচরণ হয়ে যাওয়ার কারণ অনির্ধারিত । সর্বনিম্ন, প্রথম উত্তরটি এখন 1 হবে; তবে সমস্যাটি অনেক বেশি দুষ্টু।

এখন কোডটি বিপর্যয়ের আমন্ত্রণ জানিয়েছে।

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

strcpyএর ঠিকানায় শুরু হবে এবং এটি aছাড়িয়ে অগ্রসর হবে - এবং বাইট পরে স্থানান্তর - বাইট পরে গ্রহণ করবে, যতক্ষণ না এটি শূন্য হয়।

p1পয়েন্টার ঠিক একটি ব্লক সক্রিয়া করা হয়েছে 10 বাইট।

  • যদি a কোনও ব্লকের শেষে স্থাপন করা হয় এবং প্রক্রিয়াটির অনুসরণের কোনও অ্যাক্সেস না থাকে তবে p0 [1] এর পরের পরের পঠনটি সেগফল্টটি প্রকাশ করবে। এই দৃশ্যটি x86 আর্কিটেকচারে অসম্ভব , তবে সম্ভব।

  • যদি ঠিকানাটির বাইরে অঞ্চল a হয় প্রবেশযোগ্য, কোন পঠিত ত্রুটিটি ঘটতে হবে, কিন্তু প্রোগ্রাম এখনও দৈবদুর্বিপাক থেকে সংরক্ষিত হয় না।

  • যদি একটি শূন্য বাইট ঘটে এর ঠিকানা দশ শুরুর মধ্যে ঘটতে a, এটা হতে পারে এখনও বেঁচে জন্য তারপর strcpyবন্ধ করবে এবং অন্তত আমরা একটি লেখার লঙ্ঘন ভোগে করা হবে না।

  • যদি এটি ভুল পড়ার জন্য ত্রুটিযুক্ত না হয় তবে 10 এর এই স্প্যানে কোনও শূন্য বাইট দেখা যায় না, strcpyচালিয়ে যাবে এবং বরাদ্দকৃত ব্লকের বাইরে লেখার চেষ্টা করবেmalloc

    • যদি এই অঞ্চলটি প্রক্রিয়াটির মালিকানা না পায় তবে সেগফ্ল্টটি অবিলম্বে ট্রিগার করা উচিত।

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

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

তবুও , প্রোগ্রামটিএখনও অবশ্যই সংকলন করতে হবে, কারণ এটি পুরোপুরি বৈধ এবং মানসম্পন্ন সি।

এই ধরণের ত্রুটি, কোনও মানক এবং না সংকলক অজানা থেকে রক্ষা করতে পারে না। আমি ভাবছি তারা ঠিক সেটাই আপনাকে শেখানোর ইচ্ছা করছে।

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

পোর্টেবিলিটি এবং সাধারণত্ব এটা প্রতিনিধিত্ব করে একটি মৌলিকভাবে পৃথক বিবেচনা এবং সব যে মান ঠিকানায় কামনা:

এই নথিটি ফর্মটি সুনির্দিষ্ট করে এবং প্রোগ্রামিং ল্যাঙ্গুয়েজে প্রকাশিত প্রোগ্রামগুলির ব্যাখ্যাকে প্রতিষ্ঠিত করে সি এর উদ্দেশ্য হ'ল বিভিন্ন কম্পিউটারে সিস্টেমের বহনযোগ্যতা , নির্ভরযোগ্যতা, রক্ষণাবেক্ষণযোগ্যতা এবং সি ভাষার প্রোগ্রামগুলির দক্ষ সম্পাদনাকে প্রচার করা

যে কারণে এটি ভাষাটির নিজস্ব সংজ্ঞা এবং প্রযুক্তিগত বিবরণ থেকে পৃথক রাখা একেবারে উপযুক্ত proper অনেক কি বিপরীত বিশ্বাস বলে মনে হচ্ছে সাধারণত্ব হয় বিরূদ্ধ করার ব্যতিক্রমী এবং দৃষ্টান্তমূলক

শেষ করা:

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

এটি যদি সত্য না হয়, আমরা যেমন জানি এটি প্রোগ্রামিং - এবং এটি পছন্দ করে - সম্ভব হত না।


3
এই উত্তরটি দুর্ভাগ্যক্রমে সহজাতভাবে অবৈধ। অপরিশোধিত আচরণ সম্পর্কে আপনি কোনও কারণ হতে পারেন না। তুলনাটি মেশিন পর্যায়ে করার দরকার নেই।
অ্যান্টি হাপালা

6
গিই, আসলে না। আপনি যদি সি 11 এনেক্স জে এবং 6.5.8 তে লক্ষ্য করেন তবে তুলনা করার কাজটি নিজেই ইউবি। ডেরেফারেন্সিং একটি পৃথক বিষয়।
প্যাক্সিডিয়াবলো

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

2
@Ghii, অ্যানেক্স জে (বিআইটি আমি উল্লেখ) যে জিনিস হয় তালিকা অনির্ধারিত আচরণ, তাই আমি নিশ্চিত যে কিভাবে আপনার যুক্তি :-) 6.5.8 সমর্থন স্পষ্টভাবে UB যেমন তুলনা ডেকে আছি। সুপারক্যাটে আপনার মন্তব্যের জন্য, আপনি যখন কোনও পয়েন্টার মুদ্রণ করেন তখন কোনও তুলনা চলছে যাতে আপনি সম্ভবত সঠিক যে এটি ক্রাশ হবে না। তবে ওপি এটিই জিজ্ঞাসা করছিল না। 3.4.3এছাড়াও এমন একটি অংশ যা আপনার দিকে নজর দেওয়া উচিত: এটি ইউবিটিকে আচরণ হিসাবে সংজ্ঞায়িত করে "যার জন্য এই আন্তর্জাতিক স্ট্যান্ডার্ডটির কোনও প্রয়োজন নেই"।
paxdiablo

3
@ গিভেল্টে, আপনার কাছে উল্লেখ করা সত্ত্বেও আপনি যে বিষয়গুলি কেবল স্পষ্টতই ভুল তা উল্লেখ করে চলেছেন । হ্যাঁ, আপনার পোস্ট করা স্নিপেট অবশ্যই অবশ্যই সংকলন করবে কিন্তু আপনার যুক্তি ভুল যে এটি কোনও বাধা ছাড়াই চলে। আমি আপনি আসলে সুপারিশ পড়া মান, বিশেষ করে (এই ক্ষেত্রে) C11 6.5.6/9, মনে রেখে যে শব্দ "shall" একটি ইঙ্গিত requirementL "যখন দুই পয়েন্টার বিয়োগ করা হয়, উভয় একই অ্যারে বস্তুর উপাদান গত গত এক বাতলান, অথবা হইবে অ্যারের বস্তুর উপাদান "।
paxdiablo

-5

পয়েন্টারগুলি কেবল কম্পিউটারের সমস্ত কিছুর মতো পূর্ণসংখ্যা হয়। আপনার কখনই তাদের তুলনা করতে পারবেন <এবং >বিপর্যস্ত একটি প্রোগ্রাম ঘটাচ্ছে ছাড়া এবং উত্পাদন ফলাফল নেই। এটি বলেছিল যে মানটি গ্যারান্টি দেয় না যে অ্যারে তুলনার বাইরে এই ফলাফলগুলির কোনও অর্থ আছে ।

আপনার স্ট্যাক বরাদ্দ ভেরিয়েবলগুলির উদাহরণে, সংকলক নিবন্ধগুলি মেমরি ঠিকানাগুলিতে স্ট্যাক এবং স্ট্যাকের জন্য সেই ভেরিয়েবলগুলি বরাদ্দ করতে মুক্ত এবং কোনও আদেশে এটি চয়ন করুন। তুলনা যেমন <এবং >তাই সংকলক বা আর্কিটেকচার জুড়ে সুসংগত হবে না। তবে, ==এবং !=এতটা সীমাবদ্ধ নয়, পয়েন্টার সমতার তুলনা করা একটি বৈধ এবং দরকারী অপারেশন।


2
শব্দটি স্ট্যাক সি 11 স্ট্যান্ডার্ডে ঠিক শূন্য বার প্রকাশিত হয়েছে। এবং অপরিজ্ঞাত আচরণ মানে যা কিছু ঘটতে পারে (প্রোগ্রাম ক্রাশ সহ)।
paxdiablo

1
@ পাক্সদিবলো আমি কি বলেছিলাম?
নিকেল্পপ্রো

2
আপনি স্ট্যাক-বরাদ্দ ভেরিয়েবল উল্লেখ করেছেন। স্ট্যান্ডার্ডে কোনও স্ট্যাক নেই, এটি কেবল একটি বাস্তবায়ন বিশদ। এই উত্তরের সাথে আরও গুরুতর সমস্যা হ'ল পয়েন্টারগুলিকে ক্র্যাশ হওয়ার কোনও সম্ভাবনা ছাড়াই তুলনা করতে পারবেন এমন যুক্তি that's এটি ঠিক ভুল।
প্যাক্সিডিয়াবলো

1
@ নিউকেল্প্রো: যদি কেউ জিসিসি এবং ক্ল্যাং-এ অপ্টিমাইজারের সাথে সামঞ্জস্যপূর্ণ কোডটি লিখতে চায় তবে প্রচুর বোকা হুপ করে ঝাঁপিয়ে পড়া দরকার। উভয় অপ্টিমাইজার আগ্রাসীভাবে কোন বিষয়গুলিতে পয়েন্টার দ্বারা অ্যাক্সেস করা হবে সে সম্পর্কে অনুলিপি আঁকার সুযোগগুলি সন্ধান করবে যখনই স্ট্যান্ডার্ডকে ন্যায্য করার জন্য কোনও উপায় মুছে ফেলা যায় (এবং এমনকি কখনও কখনও না থাকলেও)। প্রদত্ত int x[10],y[10],*p;, যদি কোডটি মূল্যায়ন করে y[0], তবে অন্তর্বর্তীতে কোনও সংশোধন না করে মূল্যায়ন করে p>(x+5)এবং লেখায় এবং শেষ পর্যন্ত আবার মূল্যায়ন করে, ...*ppy[0]
সুপারক্যাট

1
নিকেল্পপ্রো, দ্বিমত পোষণ করতে সম্মত হন তবে আপনার উত্তরটি এখনও মৌলিকভাবে ভুল। আমি আপনার দৃষ্টিভঙ্গিটিকে সেই লোকের সাথে তুলনা করি যা (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')পরিবর্তে ব্যবহার করে isalpha()কারণ কী এই বুদ্ধিমান প্রয়োগে এই চরিত্রগুলি বন্ধ হয়ে যায়? মূল কথাটি হ'ল, যদি আপনি জানেন যে কোনও বাস্তবায়নের ক্ষেত্রেও সমস্যা রয়েছে, আপনি পোর্টেবিলিটিটিকে যদি মূল্য দেন তবে আপনার যথাসম্ভব মানকে কোডিং করা উচিত। আমি "স্ট্যান্ডার্ড মেভেন" লেবেলের প্রশংসা করি যদিও এর জন্য ধন্যবাদ। আমি আমার সিভিতে রাখতে পারি :-)
paxdiablo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.