এটি যে কোনও, আধিকারিক বা অন্য যেভাবেই বলুক না কেন, এটি অপরিবর্তিত আচরণ নয় , কারণ এটি স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত হয়। p->s
, যখন একটি ল্যাভেলু হিসাবে ব্যবহৃত হয় ব্যতীত, অনুরূপ পয়েন্টারের সাথে মূল্যায়ন করে (char *)p + offsetof(struct T, s)
। বিশেষত, char
এটি malloc'd অবজেক্টের ভিতরে একটি বৈধ পয়েন্টার এবং এর সাথে সাথে অনুসরণ করা 100 টি (বা আরও বেশি, প্রান্তিককরণ বিবেচনার উপর নির্ভরশীল) একের পর এক ঠিকানা রয়েছে যা char
বরাদ্দকৃত বস্তুর অভ্যন্তরের অবজেক্ট হিসাবে বৈধ । সত্য যে পয়েন্টার ব্যবহার করে উদ্ভূত হয়েছিল ->
পরিবর্তে স্পষ্টভাবে যোগ পয়েন্টার দ্বারা ফিরে যাও অফসেট malloc
, কাস্ট char *
, অপ্রাসঙ্গিক।
টেকনিক্যালি, p->s[0]
একক উপাদান char
struct ভিতরে এরে, আগামী কয়েক উপাদান (যেমন p->s[1]
মাধ্যমে p->s[3]
) সম্ভবত প্যাডিং struct হয়, যা আপনি একটি সম্পূর্ণ struct যাও নিয়োগ সঞ্চালন বিকৃত হতে পারে কিন্তু যদি ভিতরে বাইট আপনি নিছক এক্সেস পৃথক সদস্যগণ এবং বাকী উপাদানগুলি বরাদ্দ হওয়া অবজেক্টে অতিরিক্ত স্থান যা আপনি পছন্দ করতে পারেন তবে আপনার পছন্দ মতো, যতক্ষণ আপনি প্রান্তিককরণের প্রয়োজনীয়তা মানেন (এবং char
কোনও প্রান্তিককরণের প্রয়োজনীয়তা নেই)।
আপনি চিন্তিত যে প্যাডিং সহ ওভারল্যাপিং সম্ভাবনা struct হয় বাইট একরকম অনুনাসিক ভূত ডাকা, আপনি প্রতিস্থাপন করে এই এড়াতে পারে হতে পারে তবে 1
এ [1]
যা নিশ্চিত করে struct হয় শেষে কোনো প্যাডিং আছে একটি মান সঙ্গে। এটি করার একটি সহজ কিন্তু অপ্রয়োজনীয় উপায় হ'ল শেষে কোনও অ্যারে বাদে অভিন্ন সদস্যদের সাথে একটি কাঠামো তৈরি করা এবং s[sizeof struct that_other_struct];
অ্যারের জন্য ব্যবহার করা। তারপরে, p->s[i]
স্ট্রাক্টের জন্য অ্যারের উপাদান হিসাবে এবং কাঠামোর i<sizeof struct that_other_struct
শেষের পরে কোনও ঠিকানায় একটি চর অবজেক্ট হিসাবে স্পষ্টভাবে সংজ্ঞায়িত করা হয় i>=sizeof struct that_other_struct
।
সম্পাদনা: প্রকৃতপক্ষে, সঠিক আকার পাওয়ার জন্য উপরের কৌশলটিতে আপনাকে অ্যারের আগে প্রতিটি সাধারণ ধরণের সমন্বয়যুক্ত একটি ইউনিয়নও লাগাতে হবে, যাতে নিশ্চিত হয়ে যায় যে অ্যারে নিজেই অন্য কোনও উপাদানের প্যাডিংয়ের মাঝখানে না হয়ে সর্বাধিক সারিবদ্ধকরণের সাথে শুরু হয় to । আবার, আমি বিশ্বাস করি না যে এগুলির কোনওটি প্রয়োজনীয়, তবে আমি সেখানকার ভাষা-আইনজীবীদের মধ্যে সবচেয়ে বিড়ম্বনার জন্য এটি উপস্থাপন করছি।
সম্পাদনা 2: প্যাডিং বাইট সহ ওভারল্যাপটি স্ট্যান্ডার্ডের অন্য অংশের কারণে অবশ্যই সমস্যা নয়। সি প্রয়োজন হয় যে যদি দুটি স্ট্রাক্ট তাদের উপাদানগুলির প্রাথমিক অনুচ্ছেদে সম্মত হয় তবে সাধারণ প্রাথমিক উপাদানগুলি উভয় প্রকারে পয়েন্টারের মাধ্যমে অ্যাক্সেস করা যায়। ফলত, যদি একটি struct অভিন্ন struct T
কিন্তু একটি বৃহত্তর চূড়ান্ত অ্যারে ঘোষিত হয়েছে, উপাদান s[0]
উপাদান সঙ্গে কাকতালীয়ভাবে করতে হবে s[0]
সালে struct T
, এবং এই অতিরিক্ত উপাদানের উপস্থিতি প্রভাবিত করতে পারে বা বড় struct হয় সাধারণ উপাদান অ্যাক্সেস দ্বারা প্রভাবিত হতে একটি পয়েন্টার ব্যবহার struct T
।