সংকলক মান পূরণ করবে কিভাবে char array[100] = {0};? এর পিছনে যাদু কী?
আমি অভ্যন্তরীণভাবে সংকলক কীভাবে আরম্ভ করে তা জানতে চেয়েছিলাম।
সংকলক মান পূরণ করবে কিভাবে char array[100] = {0};? এর পিছনে যাদু কী?
আমি অভ্যন্তরীণভাবে সংকলক কীভাবে আরম্ভ করে তা জানতে চেয়েছিলাম।
উত্তর:
এটা যাদু নয়।
সিতে এই কোডের আচরণটি সি স্পেসিফিকেশনের সেকশন of.7.৮.২১ ( সি স্পেকের অনলাইন খসড়া ) বর্ণিত হয়েছে ) : যে উপাদানগুলির একটি নির্দিষ্ট মান নেই, সূচনা করে ( এবং পুনরাবৃত্তভাবে এটি সমষ্টিগুলিতে প্রযোজ্য)।
সি ++ এ এই কোডটির আচরণটি সি ++ স্পেসিফিকেশনের (সি ++ স্পেসের অনলাইন খসড়া ) এর 8.5.1.7 বিভাগে বর্ণিত হয়েছে : সংকলক একটি নির্দিষ্ট মান নেই এমন উপাদানগুলিকে সূচনা করে।
এছাড়াও, নোট করুন যে সি ++ (তবে সি নয়) তে আপনি একটি খালি প্রারম্ভিক তালিকা ব্যবহার করতে পারেন, যার ফলে সংকলক অ্যারের সমস্ত উপাদানকে একত্রিত করে শুরু করতে পারে:
char array[100] = {};
এই কাজটি করার সময় সংকলকটি কী ধরণের কোড তৈরি করতে পারে তা সম্পর্কে এই প্রশ্নটি একবার দেখুন: অ্যারে 0-আরম্ভকরণ থেকে অদ্ভুত সমাবেশ
সংকলন বিকাশকারীদের প্রয়োগ বাস্তবায়ন।
যদি আপনার প্রশ্নটি "এই জাতীয় ঘোষণার সাথে কী হবে" - সংকলক আপনার প্রদত্ত মানের (0) মান হিসাবে প্রথমে অ্যারে উপাদান সেট করবে এবং অন্য সকলকে শূন্যতে সেট করা হবে কারণ এটি বাদ দেওয়া অ্যারে উপাদানগুলির জন্য একটি ডিফল্ট মান।
আপনার সংকলকটি যদি জিসিসি হয় তবে আপনি নিম্নলিখিত বাক্য গঠনটিও ব্যবহার করতে পারেন:
int array[256] = {[0 ... 255] = 0};
দয়া করে http://gcc.gnu.org/onlinesocs/gcc-4.1.2/gcc/Designated-Inits.html# ডিজাইনেটেড- ইনিটসটি দেখুন এবং নোট করুন যে এটি একটি সংকলক-নির্দিষ্ট বৈশিষ্ট্য।
আপনি এই আরম্ভটি কোথায় রেখেছেন তা নির্ভর করে।
অ্যারেটি যেমন স্থির থাকে তেমন
char array[100] = {0};
int main(void)
{
...
}
তারপরে এটি সংকলক যা প্রোগ্রামের ডেটা সেগমেন্টে 100 0 বাইট সংরক্ষণ করে। এক্ষেত্রে আপনি আরম্ভকারীটি বাদ দিতে পারেন।
যদি আপনার অ্যারেটি অটো হয় তবে এটি অন্য গল্প।
int foo(void)
{
char array[100] = {0};
...
}
এই ক্ষেত্রে ফাংশন foo এর প্রতিটি কল এ আপনার একটি গোপন মেমসেট থাকবে।
উপরের কোডটি সমান
int foo(void)
{
char array[100];
memset(array, 0, sizeof(array));
....
}
এবং আপনি যদি আরম্ভকারীটিকে বাদ দেন তবে আপনার অ্যারেতে এলোমেলো ডেটা (স্ট্যাকের ডেটা) থাকবে।
যদি আপনার স্থানীয় অ্যারে স্থির হিসাবে ঘোষিত হয়
int foo(void)
{
static char array[100] = {0};
...
}
তবে এটি প্রযুক্তিগতভাবে প্রথমটির মতো একই ক্ষেত্রে।