কী উস্কানিমূলক প্রশ্ন!
এমনকি এই থ্রেডের প্রতিক্রিয়া এবং মন্তব্যের কুফরী স্ক্যানিং আপনার আপাতদৃষ্টিতে সহজ এবং সরল ফরওয়ার্ড ক্যোয়ারীটি কতটা আবেগময় তা প্রকাশ করবে ।
এটি অবাক করা উচিত নয়।
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 অনেক কি বিপরীত বিশ্বাস বলে মনে হচ্ছে সাধারণত্ব হয় বিরূদ্ধ করার ব্যতিক্রমী এবং দৃষ্টান্তমূলক ।
শেষ করা:
- পয়েন্টারগুলিকে নিজেরাই পরীক্ষা এবং পরিচালনা করার বিষয়টি অবিচ্ছিন্নভাবে বৈধ এবং প্রায়শই ফলপ্রসূ । ফলাফলগুলির ব্যাখ্যা, অর্থহীন বা নাও হতে পারে তবে পয়েন্টারটিকে অবজ্ঞাপূর্ণ না করা পর্যন্ত বিপর্যয়কে কখনই আমন্ত্রণ জানানো হয় না ; লিঙ্কযুক্ত ঠিকানাটি অ্যাক্সেস করার চেষ্টা না করা পর্যন্ত ।
এটি যদি সত্য না হয়, আমরা যেমন জানি এটি প্রোগ্রামিং - এবং এটি পছন্দ করে - সম্ভব হত না।
C
কি দিয়ে নিরাপদ মধ্যেC
। একই ধরণের সাথে দুটি পয়েন্টারের তুলনা করা সর্বদা করা যায় (উদাহরণ হিসাবে সমতার জন্য পরীক্ষা করা) তবে পয়েন্টার গাণিতিক ব্যবহার করে এবং তুলনা করা হয়>
এবং<
কেবলমাত্র প্রদত্ত অ্যারে (বা মেমরি ব্লক) এর মধ্যে ব্যবহৃত হলে নিরাপদ থাকে ।