নিম্নলিখিত কাঠামো বিবেচনা করুন:
struct s {
int a, b;
};
সাধারণত 1 , এই স্ট্রাক্টটির আকার 8 এবং প্রান্তিককরণ 4 থাকবে।
যদি আমরা দুটি struct s
অবজেক্ট তৈরি করি (আরও সুনির্দিষ্টভাবে, আমরা বরাদ্দ স্টোরেজে দুটি যেমন দুটি বস্তু লিখি), দ্বিতীয় অবজেক্টটি প্রথমটি ওভারল্যাপ করে?
char *storage = malloc(3 * sizeof(struct s));
struct s *o1 = (struct s *)storage; // offset 0
struct s *o2 = (struct s *)(storage + alignof(struct s)); // offset 4
// now, o2 points half way into o1
*o1 = (struct s){1, 2};
*o2 = (struct s){3, 4};
printf("o2.a=%d\n", o2->a);
printf("o2.b=%d\n", o2->b);
printf("o1.a=%d\n", o1->a);
printf("o1.b=%d\n", o1->b);
এই প্রোগ্রামটি সম্পর্কে কি অপরিবর্তিত আচরণ? যদি তা হয়, তবে এটি কোথায় সংজ্ঞায়িত হবে? যদি এটি ইউবি না হয় তবে কি সর্বদা নিম্নলিখিত মুদ্রণের গ্যারান্টিযুক্ত:
o2.a=3
o2.b=4
o1.a=1
o1.b=3
বিশেষত, আমি জানতে চাই যে o1
কখন o2
, কোনটি এটির ওভারল্যাপ করে, কোনটি লেখা হয়েছে তার দ্বারা চিহ্নিত বস্তুর কী হয় what এখনও অব্যাহত অংশ ( o1->a
) অ্যাক্সেস করার অনুমতি দেওয়া আছে ? ক্লোবারযুক্ত অংশটি অ্যাক্সেস করা কি o1->b
কেবল অ্যাক্সেসের সমান o2->a
?
কার্যকর প্রকারটি এখানে কীভাবে প্রযোজ্য? নিয়মগুলি যথেষ্ট পরিষ্কার হয় যখন আপনি নন-ওভারল্যাপিং অবজেক্ট এবং পয়েন্টারগুলির বিষয়ে কথা বলছেন যা শেষ স্টোর হিসাবে একই অবস্থানের দিকে নির্দেশ করে তবে আপনি যখন কার্যকর ধরণের অবজেক্টের অংশ বা ওভারল্যাপিং সামগ্রীর বিষয়ে কথা বলতে শুরু করেন তখন এটি কম স্পষ্ট হয়।
দ্বিতীয় লেখাটি যদি অন্যরকমের হয় তবে কি কিছু পরিবর্তন হবে? যদি সদস্যরা বলতেন int
এবং short
তার চেয়ে দু'জন int
?
আপনি যদি এটির সাথে খেলতে চান তবে এখানে একটি গডবোল্ট ।
1 এই উত্তরটি প্ল্যাটফর্মগুলিতে প্রযোজ্য যেখানে এটিও তেমন নয়: উদাহরণস্বরূপ, কারওর আকার 4 এবং প্রান্তিককরণ 2 থাকতে পারে a অসম্ভব হও, তবে এর মতো কোনও প্ল্যাটফর্ম আছে কিনা তা সম্পর্কে আমি নিশ্চিত নই।