একটি কাঠামো 0 তে শুরু করা হচ্ছে


116

আমার যদি এর মতো কাঠামো থাকে:

typedef struct
{
    unsigned char c1;
    unsigned char c2;
} myStruct;

এই স্ট্রাক্টটি 0 থেকে শুরু করার সবচেয়ে সহজ উপায় কী হবে? নিম্নলিখিত কি যথেষ্ট হবে?

myStruct _m1 = {0};

বা আমি কি প্রতিটি সদস্যকে 0 থেকে স্পষ্টতই দীক্ষা দিতে হবে?

myStruct _m2 = {0,0};

উত্তর:


142

প্রথমটি সবচেয়ে সহজ ( কম টাইপিংয়ের সাথে জড়িত ), এবং এটির কাজের গ্যারান্টিযুক্ত, সমস্ত সদস্যকে 0[রেফ 1] তে সেট করা হবে ।
দ্বিতীয়টি আরও পাঠযোগ্য।

পছন্দটি ব্যবহারকারীর পছন্দ বা আপনার কোডিং মানক আদেশের উপর নির্ভর করে।

[ রেফার 1] রেফারেন্স C99 স্ট্যান্ডার্ড 6.7.8.21:

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

ভাল পড়ুন:
সি এবং সি ++: স্বয়ংক্রিয় কাঠামোর আংশিক সূচনা


9
এছাড়াও, আমি ব্যবহার করছি = {};তবে আমি নিশ্চিত নই যে এটি বৈধ কিনা।
উইলিয়াম এন্টারিকেন 21

15
প্রারম্ভিককরণের জন্য @ ফুলডিসেন্ট খালি বন্ধনীগুলি একটি জিএনইউ এক্সটেনশন।
a3f

2
@ उেরাম 65536 প্রশ্নের উত্তর সি ++ নয় is
এফ

3
আমি একটি ত্রুটি পেয়েছি: "প্রারম্ভিকের চারপাশে
ব্রেসগুলি

3
@Edenia। আমি একমত নই এর foo = {0}অর্থ আমি ইতিমধ্যে জানি । যদি আমি দেখে থাকি তবে আমাকে foo = ZERO_FULLZERO_FULL এর সংজ্ঞার জন্য গ্রেপ করতে হবে।
অ্যান্ড্রু বেনব্রিজে

32

যদি ডেটা স্থিতিশীল বা গ্লোবাল ভেরিয়েবল হয় তবে এটি ডিফল্টরূপে শূন্য-পূর্ণ, তাই কেবল এটি ঘোষণা করুন myStruct _m;

যদি ডেটা স্থানীয় ভেরিয়েবল বা হিপ-বরাদ্দ অঞ্চল হয় তবে এটির memsetমতো এটি সাফ করুন :

memset(&m, 0, sizeof(myStruct));

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

আপনি সম্ভবত কোড করতে পারেন myStruct m = {};বা myStruct m = {0};(এমনকি যদি প্রথম সদস্যটি myStructস্কেলার না হয়)।

আমার অনুভূতিটি হ'ল memsetস্থানীয় কাঠামোর জন্য ব্যবহার করা সবচেয়ে ভাল এবং এটি এই সত্যটি আরও ভাল করে তুলে ধরেছে যে রানটাইম সময়ে কিছু করা উচিত (যখন সাধারণত, গ্লোবাল এবং স্ট্যাটিক ডেটা সংকলন সময়ে শুরু হিসাবে বোঝা যায়, রানটাইম ছাড়াই কোনও ব্যয় ছাড়াই) ।


7
স্ট্রাক্টের সমস্ত বাইট সেট 0করা 0যদিও সমস্ত স্ট্রাক সদস্যের সাথে আরম্ভ করার সমান হবে তার কোনও গ্যারান্টি নেই । অনেক প্ল্যাটফর্মে এটি সত্য হবে, তবে সর্বজনীন নয়।
স্যান্ডার ডি ডিকার

1
আপনি একটি উদাহরণ ভাগ করতে পারেন, স্যান্ডার? আসল কৌতূহল। (স্পষ্টতই, সর্বজনীন সত্যের অর্থ এই নয় যে এটি সহজে ব্যাখ্যা করার মতো সহজ ব্যতিক্রম নয়, তবে যদি সেখানে থাকে ...)
স্টিভেন ফিশার

2
সি মান নাল পয়েন্টার অনুমতি দেয় (অথবা একটি শূন্য ফ্লোটিং পয়েন্ট সংখ্যা) সব শূন্য বিট ছাড়া অন্য কিছু মেমরি প্রতিনিধিত্ব করতে হবে। খুব কম এবং অদ্ভুত বাস্তবায়নগুলি এটি করছে (আমি কোনওটির নাম দিতে পারি না)।
বেসিল স্টারিঙ্কেভিচ

-১, আপনি ওপেনটি কুৎসিত সম্পর্কে জিজ্ঞাসা করা সূচনাটি খুঁজে পেতে পারেন, তবে এটি স্ট্যান্ডার্ডের চেয়ে ঠিক তাই এবং এটি সমস্ত সংকলক সহজেই অনুকূলিত করতে পারেন can তারপরে, ফর্মটি {}বৈধ সি নয় তবে কেবল সি ++ এ উপলব্ধ।
জেনস গুষ্ট্ট

7
@ স্টিভেন: আমি কেবল অস্পষ্ট এবং / অথবা পুরানো প্ল্যাটফর্মের কথা ভাবতে পারি। সি এফএকিউতে প্ল্যাটফর্মগুলির একটি তালিকা রয়েছে যাতে একটি NULLপয়েন্টার ছিল যা সমস্ত 0বিট ছিল না : c-faq.com/null/machexamp.html । এবং তারপরে সম্ভাবনা রয়েছে যে প্ল্যাটফর্মটি আইআইইই 754 ব্যবহার করে ভাসমান পয়েন্টের মানগুলি উপস্থাপন করছে না, তবে এমন কিছু অন্য উপস্থাপনা ব্যবহার করেছে যার সমস্ত 0বিট 0.0মান নেই - তবে অবশ্যই আমি এই জাতীয় প্ল্যাটফর্মটি জানি না।
Sander De Dycker

19

§§..7.৯ সূচনা দেখুন:

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

সুতরাং, হ্যাঁ তারা দুজনেই কাজ করে। মনে রাখবেন যে C99 এ নতুনকরণের একটি নতুন উপায়, নামকরণকৃত সূচনাও ব্যবহার করা যেতে পারে:

myStruct _m1 = {.c2 = 0, .c1 = 1};

উল্লেখযোগ্যভাবে এটি ইতিমধ্যে C89: open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf# পৃষ্ঠা=139 (নির্দিষ্ট সংকেত প্রক্রিয়াকরণের লক্ষ্যমাত্রার জন্য গুরুত্বপূর্ণ)
টোবিয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.