c++ - 0-আকারের গতিশীল অ্যারেতে পয়েন্টার বাড়ানো কি সংজ্ঞায়িত?




pointers undefined-behavior (2)

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

আপনার 0-আকারের অ্যারের জন্য, p ইতিমধ্যে শেষের এক দিকে ইঙ্গিত করছে, সুতরাং এটি বাড়ানোর অনুমতি নেই।

+ অপারেটর সম্পর্কিত সি ++ 17 8.7 / 4 দেখুন ( ++ একই বিধিনিষেধ রয়েছে):

f এক্সপ্রেশন P , এন উপাদানগুলির সাথে অ্যারের অবজেক্ট x এর এলিমেন্ট x[i] , P + J এবং J + P (যেখানে J এর মান j ) এক্সপ্রেশনটি (সম্ভবত-অনুমানমূলক) এলিমেন্ট x[i+j] যদি 0≤i + জান; অন্যথায়, আচরণটি সংজ্ঞায়িত।

আফাইক, যদিও আমরা 0-আকারের স্ট্যাটিক-মেমরি অ্যারে তৈরি করতে পারি না, তবে আমরা গতিশীলগুলির সাথে এটি করতে পারি:

int a[0]{}; // Compile-time error
int* p = new int[0]; // Is well-defined

আমি যেমন পড়েছি, p এক-অতীত-শেষের উপাদানটির মতো কাজ করে। আমি p ঠিকানা যে ঠিকানা মুদ্রণ করতে পারেন।

if(p)
    cout << p << endl;
  • যদিও আমি নিশ্চিত যে আমরা সেই পয়েন্টারটিকে (অতীত-শেষ-উপাদান) অবহেলা করতে পারি না যেহেতু আমরা পুনরাবৃত্তির সাথে (অতীত-শেষ উপাদান) করতে পারি না, তবে আমি কীসের বিষয়ে নিশ্চিত নই যে সেই পয়েন্টার p বাড়ানো কিনা? একটি অপরিবর্তিত আচরণ (ইউবি) কি পুনরাবৃত্তকারীদের মতো?

    p++; // UB?

আমার ধারণা আপনার কাছে ইতিমধ্যে উত্তরটি আছে; আপনি যদি কিছুটা গভীর দেখায়: আপনি বলেছেন যে একটি অফ-দ্য-এ-এডেটর বাড়ানো এইভাবে ইউবি হয়: এই উত্তরটি একটি পুনরাবৃত্তিকে কী বলে?

পুনরুক্তিকারী কেবলমাত্র একটি অবজেক্ট যার একটি পয়েন্টার রয়েছে এবং বাড়ানো হচ্ছে যে পুনরুক্তিকারীটি এটির পয়েন্টারটি সত্যিই বাড়িয়ে দিচ্ছে। সুতরাং অনেক দিক থেকে একটি পুনরাবৃত্তিকে পয়েন্টারের শর্তে পরিচালনা করা হয়।

int arr [] = {0,1,2,3,4,5,6,7,8,9};

int * p = arr; // পি আরআর প্রথম উপাদানকে নির্দেশ করে

++, পি; // পি আরআর পয়েন্ট [1]

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

int * e = & আরআর [10]; // পয়েন্টারটি আরারের শেষ উপাদানটি পেরিয়ে গেছে

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

এটি লিপম্যানের সি ++ প্রাইমার 5 সংস্করণ থেকে।

সুতরাং এটি ইউবি এটি করবেন না।





dynamic-arrays