অ্যারে [100] কীভাবে = {0 the পুরো অ্যারে 0 তে সেট করে?


140

সংকলক মান পূরণ করবে কিভাবে char array[100] = {0};? এর পিছনে যাদু কী?

আমি অভ্যন্তরীণভাবে সংকলক কীভাবে আরম্ভ করে তা জানতে চেয়েছিলাম।


1
সি বা সি ++ এ? এগুলি দুটি পৃথক প্রশ্ন।
টবি স্পিড 15

উত্তর:


163

এটা যাদু নয়।

সিতে এই কোডের আচরণটি সি স্পেসিফিকেশনের সেকশন of.7.৮.২১ ( সি স্পেকের অনলাইন খসড়া ) বর্ণিত হয়েছে ) : যে উপাদানগুলির একটি নির্দিষ্ট মান নেই, সূচনা করে ( এবং পুনরাবৃত্তভাবে এটি সমষ্টিগুলিতে প্রযোজ্য)।

সি ++ এ এই কোডটির আচরণটি সি ++ স্পেসিফিকেশনের (সি ++ স্পেসের অনলাইন খসড়া ) এর 8.5.1.7 বিভাগে বর্ণিত হয়েছে : সংকলক একটি নির্দিষ্ট মান নেই এমন উপাদানগুলিকে সূচনা করে।

এছাড়াও, নোট করুন যে সি ++ (তবে সি নয়) তে আপনি একটি খালি প্রারম্ভিক তালিকা ব্যবহার করতে পারেন, যার ফলে সংকলক অ্যারের সমস্ত উপাদানকে একত্রিত করে শুরু করতে পারে:

char array[100] = {};

এই কাজটি করার সময় সংকলকটি কী ধরণের কোড তৈরি করতে পারে তা সম্পর্কে এই প্রশ্নটি একবার দেখুন: অ্যারে 0-আরম্ভকরণ থেকে অদ্ভুত সমাবেশ


সমস্ত সি সংকলকরা কি এটি করে? আমি বিশ্বাস করি যে কেবল ভিজ্যুয়াল স্টুডিও এটি করে।
জেএফএ

1
সি ++ স্পেসের অনলাইন খসড়া ভাঙা, কারও নতুন লিঙ্ক আছে?
বেহরোজ করজু

35

সংকলন বিকাশকারীদের প্রয়োগ বাস্তবায়ন।

যদি আপনার প্রশ্নটি "এই জাতীয় ঘোষণার সাথে কী হবে" - সংকলক আপনার প্রদত্ত মানের (0) মান হিসাবে প্রথমে অ্যারে উপাদান সেট করবে এবং অন্য সকলকে শূন্যতে সেট করা হবে কারণ এটি বাদ দেওয়া অ্যারে উপাদানগুলির জন্য একটি ডিফল্ট মান।


আমার কোনও উত্স নেই তবে আমি নিশ্চিত যে আমি কোথাও পড়েছি যে অ্যারের ঘোষণার জন্য কোনও ডিফল্ট মান নেই; ইতিমধ্যে সেখানে যা কিছু আবর্জনা ছিল তা আপনি পাবেন। আপনি যখনই সেগুলি মুছে ফেলতে পারেন তখন এই মানগুলি নির্ধারণ করার সময় নষ্ট করার কোনও অর্থ নেই।
রায়ান ফক্স

10
রায়ান, আপনি যদি প্রথম উপাদানটির জন্য কোনও মান নির্ধারণ না করেন যে পুরো অ্যারেটি অবিচ্ছিন্ন এবং প্রকৃতপক্ষে আবর্জনা রয়েছে তবে আপনি যদি এটির কমপক্ষে একটি উপাদানের জন্য কোনও মান সেট করেন তবে পুরো অ্যারেটি আরম্ভ হয় তাই অনির্ধারিত উপাদানগুলিকে স্পষ্টভাবে আরম্ভ করা হয় 0.
কিউআরডিএল

1
সি ++ এর জন্য একটি সীমাবদ্ধ বাঞ্ছনীয় অ্যারের জন্য একটি খালি প্রারম্ভিক তালিকা সমস্ত উপাদানকে আরম্ভ করে।
ডাল

2
@ নাটানইলিন আমি কোথায় বললাম যে এটি অপরিজ্ঞাত? মন্তব্য এবং ডাউনভোটিংয়ের আগে দয়া করে পুরো উত্তরটি পড়ুন।
qrdl

1
@Qrdl আপনি ঠিক বলেছেন আমি বাস্তবায়ন সম্পর্কে আপনার মন্তব্য ভুল বুঝেছি। দুর্ভাগ্যক্রমে, আমি এখন আমার ভোট পরিবর্তন করতে পারি না।
নাটান ইয়েলিন

27

আপনার সংকলকটি যদি জিসিসি হয় তবে আপনি নিম্নলিখিত বাক্য গঠনটিও ব্যবহার করতে পারেন:

int array[256] = {[0 ... 255] = 0};

দয়া করে http://gcc.gnu.org/onlinesocs/gcc-4.1.2/gcc/Designated-Inits.html# ডিজাইনেটেড- ইনিটসটি দেখুন এবং নোট করুন যে এটি একটি সংকলক-নির্দিষ্ট বৈশিষ্ট্য।


স্বাগত! আপনি যেহেতু আরও ধরণের কৌশলগুলি
সন্ধানের

1
আপনি যদি এটি চয়ন করেন তবে আপনি অবশ্যই এটি করতে পারেন, তবে এটির মতো সংকলক-নির্দিষ্ট এক্সটেনশনের উপর নির্ভর করার স্পষ্ট অসুবিধা রয়েছে।
ড্যান ওলসন

@ ড্যান ওলসন তাঁর প্রশ্নটি নিজেই নির্দিষ্ট সংকলক সম্পর্কে জিজ্ঞাসা করছেন এবং তাই এটি পোস্ট করেছেন। আপনি যদি এটি অকেজো মনে করেন তবে আমি মুছে ফেলব।
লক্ষ্মণরাজ

5
এটি অকেজো নয়, এটি আকর্ষণীয়। সাবধানবাণীটি কেবল উল্লেখ করার যোগ্য।
ড্যান অলসন

2
এটি এমন জিনিস যা আমাকে
এসওতে

19

আপনি এই আরম্ভটি কোথায় রেখেছেন তা নির্ভর করে।

অ্যারেটি যেমন স্থির থাকে তেমন

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};
...
}

তবে এটি প্রযুক্তিগতভাবে প্রথমটির মতো একই ক্ষেত্রে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.