আমি যদি সি / সি ++ তে 0-আকারের অ্যারে সংজ্ঞায়িত করি তবে কী হবে?


127

শুধু কৌতূহল, আমি int array[0];কোডে একটি শূন্য দৈর্ঘ্যের অ্যারের সংজ্ঞা দিলে আসলে কী ঘটে ? জিসিসি মোটেই অভিযোগ করে না।

নমুনা প্রোগ্রাম

#include <stdio.h>

int main() {
    int arr[0];
    return 0;
}

শোধন

আমি দারহজারের মন্তব্যে পরিবর্তনশীল দৈর্ঘ্যের মতো ইঙ্গিত করার পরিবর্তে শূন্য-দৈর্ঘ্যের অ্যারেগুলি এভাবে শুরু করা হয়েছিল কিনা তা খুঁজে বের করার চেষ্টা করছি optim

এর কারণ হল আমি বন্য মধ্যে কিছু কোডটি মুক্তি আছে, তাই আমি হ্যান্ডেল ক্ষেত্রে যেখানে আছে চিন্তা করার চেষ্টা করছি SIZEহিসাবে সংজ্ঞায়িত করা হয় 0, যা একটি স্ট্যাটিক্যালি সংজ্ঞায়িত সঙ্গে কিছু কোডে ঘটবেint array[SIZE];

আমি আসলে অবাক হয়ে গিয়েছিলাম যে জিসিসি অভিযোগ করে না, যা আমার প্রশ্নকে উত্থাপন করেছিল। আমি যে উত্তর পেয়েছি সেগুলি থেকে, আমি বিশ্বাস করি যে একটি সতর্কতার অভাব মূলত পুরানো কোডকে সমর্থন করার কারণে যা নতুন [] বাক্যবিন্যাসের সাথে আপডেট হয়নি।

যেহেতু আমি মূলত ত্রুটিটি নিয়ে ভাবছিলাম, আমি লন্ডিনের উত্তরটিকে সঠিক হিসাবে ট্যাগ করছি (নওয়াজের প্রথম ছিল, তবে এটি সম্পূর্ণ ছিল না) - অন্যরা লেজ-প্যাডযুক্ত কাঠামোর জন্য এর প্রকৃত ব্যবহারের দিকে ইঙ্গিত করছিলেন, যদিও প্রাসঙ্গিক, ইএসএন ' আমি ঠিক কি খুঁজছিলাম।


51
@ আলেকজান্ডারকরউইন: দুর্ভাগ্যক্রমে সি ++-তে, অপরিজ্ঞাত আচরণ, অ-মানক এক্সটেনশান এবং অন্যান্য অসঙ্গতিগুলির সাথে নিজেকে কিছু চেষ্টা করা জ্ঞানের পথে নয়।
বেনজামিন লিন্ডলি

5
@ জাস্টিনকির্ক আমি কেবল পরীক্ষার মাধ্যমে এটির কাজটি আটকে দিয়ে আটকা পড়েছি। এবং আমার পোস্টে আমি যে সমালোচনা পেয়েছি তার কারণে, আমি শিখেছি যে এটির পরীক্ষা করা এবং এটি সিলিংয়ের অর্থ এটি বৈধ এবং আইনী নয়। তাই একটি স্ব-পরীক্ষা কখনও কখনও বৈধ হয় না।
স্টর্মবাইট

2
@ জাস্টিনকির্ক, আপনি কোথায় এটি ব্যবহার করবেন তার উদাহরণের জন্য ম্যাথিউয়ের উত্তর দেখুন । এটি কোনও টেমপ্লেটে কার্যকর হতে পারে যেখানে অ্যারের আকারটি একটি টেম্পলেট প্যারামিটার। প্রশ্নের উদাহরণটি অবশ্যই প্রসঙ্গের বাইরে।
মার্ক রান্সম

2
@ জাস্টিনকির্ক: []পাইথন বা এমনকি ""সি- তেও কী উদ্দেশ্য ? কখনও কখনও, আপনি একটি ফাংশন বা ম্যাক্রো পেয়েছেন যার জন্য একটি অ্যারের প্রয়োজন, তবে এটিতে কোনও ডেটা আপনার হাতে নেই।
dan04

15
"সি / সি ++" কী? এ দুটি পৃথক ভাষা
32-তে অরবিট

উত্তর:


86

একটি অ্যারের শূন্য আকার থাকতে পারে না।

আইএসও 9899: 2011 6.7.6.2:

যদি অভিব্যক্তিটি একটি ধ্রুবক অভিব্যক্তি হয় তবে এর মান শূন্যের চেয়ে বড় হবে।

উপরের পাঠ্যটি উভয়ই প্লেইন অ্যারে (অনুচ্ছেদ 1) এর জন্য সত্য। কোনও ভিএলএর (পরিবর্তনশীল দৈর্ঘ্যের অ্যারে) জন্য, যদি অভিব্যক্তির মান শূন্যের চেয়ে কম বা সমান হয় (অনুচ্ছেদ 5) তবে আচরণটি নির্ধারিত হয়। এটি সি স্ট্যান্ডার্ডে আদর্শ পাঠ্য। কোনও সংকলককে এটি আলাদাভাবে প্রয়োগ করার অনুমতি নেই।

gcc -std=c99 -pedantic নন-ভিএলএ মামলার জন্য একটি সতর্কতা দেয়।


34
"এটি অবশ্যই একটি ত্রুটি দিতে হবে" - "সতর্কতা" এবং "ত্রুটি" এর মধ্যে পার্থক্যটি মান হিসাবে স্বীকৃত নয় (এটি কেবল "ডায়াগনস্টিকস" উল্লেখ করে), এবং একমাত্র পরিস্থিতি যেখানে সংকলন অবশ্যই থামাতে হবে [অর্থাৎ আসল-বিশ্বের পার্থক্য) সতর্কতা এবং ত্রুটির মধ্যে] একটি #errorনির্দেশের মুখোমুখি ।
র্যান্ডম 832

12
এফওয়াইআই, একটি সাধারণ নিয়ম হিসাবে, (সি বা সি ++) স্ট্যান্ডার্ডগুলি কেবলমাত্র কম্পাইলারদের কী অনুমতি দিতে হবে তা জানায় তবে তাদের কী অস্বীকার করা উচিত তা নয় । কিছু ক্ষেত্রে, তারা বর্ণিত হবে যে সংকলকটি একটি "ডায়াগনস্টিক" জারি করা উচিত তবে এটি তারা যেমনটি পান ঠিক তেমন সুনির্দিষ্ট। বাকিটি সংকলক বিক্রেতাকে ছেড়ে দেওয়া হয়েছে। সম্পাদনা: র‌্যান্ডম 832 কী বলেছে।
এমসিএমসিসি

8
@ লন্ডিন "একটি সংকলককে শূন্য-দৈর্ঘ্যের অ্যারেযুক্ত বাইনারি তৈরি করার অনুমতি নেই।" স্ট্যান্ডার্ডটি একেবারে বাছাইয়ের কিছুই বলে না। এটি কেবলমাত্র বলে যে এটির আকারের জন্য শূন্য-দৈর্ঘ্যের ধ্রুবক অভিব্যক্তি সহ একটি অ্যারেযুক্ত উত্স কোড দেওয়া হলে অবশ্যই কমপক্ষে একটি ডায়াগনস্টিক বার্তা উত্পন্ন করতে হবে। একমাত্র পরিস্থিতি যার অধীনে স্ট্যান্ডার্ডটি কোনও সংকলককে বাইনারি তৈরি করতে নিষেধ করে তা যদি এটি #errorপ্রিপ্রোসেসর নির্দেশকের মুখোমুখি হয় ।
র্যান্ডম 832

5
@ লন্ডিন সমস্ত সঠিক ক্ষেত্রে বাইনারি তৈরি করাকে # 1 সন্তুষ্ট করে এবং ভুল কেসের জন্য একটি উত্পন্ন বা উত্পন্ন না করায় এটি প্রভাব ফেলবে না। একটি সতর্কতা মুদ্রণ # 3 এর জন্য যথেষ্ট। এই আচরণের # 2 এর সাথে কোনও প্রাসঙ্গিকতা নেই, যেহেতু স্ট্যান্ডার্ডটি এই উত্স কোডটির আচরণ নির্ধারণ করে না।
র্যান্ডম 832

13
@ লন্ডিন: মূল বক্তব্যটি হ'ল আপনার বক্তব্যটি ভুল হয়েছে; অনুসারী কম্পাইলার হয় , একটি বাইনারি একটি শূন্য দৈর্ঘ্যের অ্যারে ধারণকারী নির্মাণের অনুমতি যতদিন একটি ডায়গনিস্টিক জারি করা হয়।
কিথ থম্পসন

85

মান অনুসারে, এটি অনুমোদিত নয়।

তবে সি ঘোষণাকারীদের এই ঘোষণাকে নমনীয় অ্যারে সদস্য ( এফএএম ) ঘোষণার হিসাবে বিবেচনা করার জন্য এটি বর্তমান অনুশীলন ছিল :

C99 6.7.2.1, §16 : একটি বিশেষ ক্ষেত্রে হিসাবে, একাধিক নামধারী সদস্যের সাথে কাঠামোর শেষ উপাদানটির অসম্পূর্ণ অ্যারে প্রকার থাকতে পারে; এটিকে নমনীয় অ্যারে সদস্য বলা হয়।

একটি এফএএম এর স্ট্যান্ডার্ড সিনট্যাক্সটি হ'ল:

struct Array {
  size_t size;
  int content[];
};

ধারণাটি হ'ল আপনি তারপরে এটি বরাদ্দ করবেন:

void foo(size_t x) {
  Array* array = malloc(sizeof(size_t) + x * sizeof(int));

  array->size = x;
  for (size_t i = 0; i != x; ++i) {
    array->content[i] = 0;
  }
}

আপনি এটি স্ট্যাটিকালিও ব্যবহার করতে পারেন (জিসিসি এক্সটেনশন):

Array a = { 3, { 1, 2, 3 } };

এটি লেজ-প্যাডযুক্ত কাঠামো হিসাবেও পরিচিত (এই শব্দটি সি 99 স্ট্যান্ডার্ডের প্রকাশের পূর্বাভাস দেয়) বা স্ট্রাক হ্যাক (এটি নির্দেশ করার জন্য জো র্রেছনিগকে ধন্যবাদ)।

তবে এই বাক্য গঠনটি প্রমিত হয়েছে (এবং এর প্রভাবগুলি গ্যারান্টিযুক্ত) কেবলমাত্র C99 এ। একটি ধ্রুব আকার আগে প্রয়োজন ছিল।

  • 1 এটি বহনযোগ্য পোর্টেবল উপায় ছিল, যদিও এটি অদ্ভুত ছিল।
  • 0 অভিপ্রায়টি ইঙ্গিত করার ক্ষেত্রে আরও ভাল ছিল তবে কিছুটা কম্পাইলার (জিসিসি সহ) দ্বারা এক্সটেনশন হিসাবে স্ট্যান্ডার্ডটি সম্পর্কিত এবং আইন হিসাবে সমর্থন করা আইনসম্মত নয়।

লেজ প্যাডিং অনুশীলন, যে স্টোরেজ উপলব্ধ (সতর্ক malloc) তাই সাধারণভাবে স্ট্যাক ব্যবহারের জন্য উপযুক্ত নয় যে উপর নির্ভর করে ।


@ লন্ডিন: আমি এখানে কোনও ভিএলএ দেখিনি, সমস্ত আকারগুলি সংকলনের সময় জানা যায়। নমনীয় অ্যারের শব্দটি থেকে আসে gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Zero-Length.html এবং Doe যোগ্যতা অর্জন int content[];যতটা আমি বুঝেছি এখানে। যেহেতু আমি শিল্পের সি পদগুলিতে খুব বেশি সচেতন নই ... আপনি কি আমার যুক্তিটি সঠিক বলে মনে করছেন তা নিশ্চিত করতে পারবেন?
ম্যাথিউ এম।

@ ম্যাথিউইউএম .: সি ৯৯.7.২.১, §১:: একটি বিশেষ ঘটনা হিসাবে, একাধিক নামধারী সদস্যের সাথে কাঠামোর শেষ উপাদানটির অসম্পূর্ণ অ্যারে থাকতে পারে; এটিকে নমনীয় অ্যারে সদস্য বলা হয়।
ক্রিস্টোফ

এই আইডিয়োমটি "স্ট্রাক হ্যাক" নামেও পরিচিত এবং আমি "লেজ-প্যাডড স্ট্রাকচার" এর চেয়ে বেশি পরিচিত লোকের সাথে পরিচিত হয়েছি (ভবিষ্যতে এবিআইয়ের সামঞ্জস্যের জন্য কাঠামোর প্যাডিংয়ের জেনেরিক রেফারেন্স ছাড়া এটি আগে কখনও শুনেনি) ) বা "নমনীয় অ্যারে সদস্য" যা আমি C99 এ প্রথম শুনেছিলাম।

1
স্ট্রাক হ্যাকের জন্য 1 এর অ্যারের আকার ব্যবহার করে সংকলক স্কাউক হওয়া এড়ানো যেত, তবে এটি কেবল "পোর্টেবল" ছিল কারণ সংকলক লেখকরা ডি-ফ্যাক্টো স্ট্যান্ডার্ড হিসাবে এই জাতীয় ব্যবহারের স্বীকৃতি দিতে যথেষ্ট চমৎকার ছিলেন। যদি এটি শূন্য-আকারের অ্যারেগুলিতে নিষেধাজ্ঞার জন্য না হয়, প্রোগ্রামার 'ক্রমযুক্ত বিকল্প হিসাবে একক-উপাদান অ্যারেগুলির ফলস্বরূপ ব্যবহার করে এবং সংকলক লেখকদের historicalতিহাসিক মনোভাব যে স্ট্যান্ডার্ডের প্রয়োজন অনুসারেও প্রোগ্রামারের প্রয়োজনগুলি পরিবেশন করা উচিত, সংকলক লেখকরা যখনই একটি একক উপাদান অ্যারে ছিল সহজেই এবং কার্যকরভাবে অনুকূলিত foo[x]হয়েছে । foo[0]foo
সুপারক্যাট

1
@ রবার্টসম্পোর্টস মনিকাসেলিও: এটি উত্তরে স্পষ্টভাবে দেখানো হয়েছে, তবে শেষ পর্যন্ত । যাওয়ার বিষয়টি আরও পরিষ্কার করার জন্য, আমি ব্যাখ্যাটি ফ্রন্ট-লোড করেছি।
ম্যাথিউ এম এম

58

স্ট্যান্ডার্ড সি এবং সি ++ এ শূন্য-আকারের অ্যারে অনুমোদিত নয় ..

আপনি যদি জিসিসি ব্যবহার করেন তবে এটি -pedanticবিকল্পের সাথে সংকলন করুন । এটি সতর্কতা দেবে , বলেছেন:

zero.c:3:6: warning: ISO C forbids zero-size array 'a' [-pedantic]

সি ++ এর ক্ষেত্রে এটি অনুরূপ সতর্কতা দেয়।


9
ভিজ্যুয়াল সি ++ ২০১০ তে:error C2466: cannot allocate an array of constant size 0
মার্ক রান্সম

4
-অরওয়ার্স সমস্ত সতর্কতাগুলিকে কেবল ত্রুটিতে পরিণত করে, এটি জিসিসি সংকলকটির ভুল আচরণটি স্থির করে না।
লন্ডিন

সি ++ বিল্ডার ২০০৯ও সঠিকভাবে একটি ত্রুটি দেয়:[BCC32 Error] test.c(3): E2021 Array must have at least one element
লন্ডিন

1
পরিবর্তে -pedantic -Werror, আপনি কেবল করতে পারেন-pedantic-errors
স্টিফান ডলবার্গ

3
একটি শূন্য আকারের অ্যারে শূন্য আকারের মতো একই জিনিস নয় std::array। (একদিকে: আমি স্মরণ করছি কিন্তু ভিএলএগুলি সি ++ এ থাকা থেকে স্পষ্টভাবে প্রত্যাখ্যান করা হয়েছিল বলে উত্সটি খুঁজে পাই না))

27

এটি সম্পূর্ণ অবৈধ, এবং সর্বদা ছিল, কিন্তু ত্রুটি সংকেত দিতে অনেক সংকলক অবহেলিত। আপনি কেন এটি করতে চান তা আমি নিশ্চিত নই। আমি যে ব্যবহারটি জানি তার মধ্যে একটি বুলিয়ান থেকে একটি সংকলন সময় ত্রুটি ট্রিগার করা হয়:

char someCondition[ condition ];

যদি conditionকোনও মিথ্যা হয় তবে আমি একটি সংকলন সময় ত্রুটি পাই। কারণ সংকলকগণ এটির অনুমতি দেয় তবে আমি ব্যবহারটি গ্রহণ করেছি:

char someCondition[ 2 * condition - 1 ];

এটি 1 বা -1 এর আকার দেয় এবং আমি কোনও সংকলক কখনও পাইনি যা -1 আকার গ্রহণ করবে।


এটির জন্য এটি একটি আকর্ষণীয় হ্যাক।
অ্যালেক্স কোয়ে

10
এটি রূপান্তর করার একটি সাধারণ কৌশল, আমি মনে করি। STATIC_ASSERTএটি ব্যবহারের বাস্তবায়ন যদি আমি অবাক হব না ।
জেমস কানজে

কেন শুধু নয়:#if condition \n #error whatever \n #endif
জেরফভ 2

1
@ জেরফভ ২ কারণ শর্তটি প্রিপ্রসেসিংয়ের সময়টি জানা নাও হতে পারে, কেবলমাত্র সময় সংকলন করে
rmeador

9

আমি যুক্ত করব যে এই যুক্তিতে জিসিসির অনলাইন ডকুমেন্টেশনের পুরো পৃষ্ঠা রয়েছে।

কিছু উদ্ধৃতি:

শূন্য দৈর্ঘ্যের অ্যারেগুলি জিএনইউ সি তে অনুমোদিত are

আইএসও সি 90 এ আপনাকে লিখিত সামগ্রী 1 দিয়ে দিতে হবে

এবং

জি.সি.সি. সংস্করণগুলি 3.0 এর আগে শূন্য-দৈর্ঘ্যের অ্যারেগুলি স্থিতিশীলভাবে আরম্ভ করার অনুমতি দেয়, যেন তারা নমনীয় অ্যারে হয়। যেসব ক্ষেত্রে দরকারী ছিল তা ছাড়াও এটি এমন পরিস্থিতিতে প্রাথমিকের অনুমতি দেয় যা পরবর্তী ডেটাগুলিকে দূষিত করবে would

সুতরাং আপনি পারে

int arr[0] = { 1 };

এবং গম্ভীর :-)


আমি কি পছন্দ করতে পারি int a[0], তাহলে a[0] = 1 a[1] = 2??
সুরজ জৈন

2
@ সুরজজাইন আপনি যদি নিজের স্ট্যাকটি ওভাররাইট করতে চান :-) সি আপনি লিখছেন এমন অ্যারের আকারের তুলনায় সূচকটি পরীক্ষা করে না a[100000] = 5, তবে আপনি যদি ভাগ্যবান হন তবে আপনি কেবল আপনার অ্যাপটি ক্র্যাশ করবেন, আপনি যদি ভাগ্যবান হন: -)
xanatos

ইন্ট আ [0]; একটি পরিবর্তনশীল অ্যারের অর্থ (শূন্য আকারের অ্যারে), আমি এখন এটি কীভাবে নির্ধারণ করতে পারি
সুরজ জৈন

@ সুরজজাইন "সি লিখছেন যে অ্যারে আপনি লিখছেন তার আকারের তুলনায় সি" এর কোন অংশটি পরিষ্কার নয়? সি তে কোনও সূচী পরীক্ষণ নেই, আপনি অ্যারের শেষের পরে লিখতে পারেন এবং কম্পিউটার ক্র্যাশ করতে পারেন বা আপনার মেমরির মূল্যবান বিটগুলি ওভাররাইট করতে পারেন। সুতরাং আপনার যদি 0 টি উপাদানের একটি অ্যারে থাকে তবে আপনি 0 টি উপাদানের সমাপ্তির পরে লিখতে পারেন।
xanatos


9

শূন্য-দৈর্ঘ্যের অ্যারেগুলির আরেকটি ব্যবহার হল ভেরিয়েবল-দৈর্ঘ্যের অবজেক্ট (প্রাক-C99) তৈরি করার জন্য। জিরো দৈর্ঘ্যের অ্যারে হয় বিভিন্ন থেকে নমনীয় অ্যারে [] 0 টি ছাড়া যা।

জিসিসি ডক থেকে উদ্ধৃত :

জিরো-দৈর্ঘ্যের অ্যারেগুলি জিএনইউ সি তে অনুমোদিত হয় তারা কাঠামোর শেষ উপাদান হিসাবে খুব কার্যকর যা ভেরিয়েবল-দৈর্ঘ্যের বস্তুর জন্য সত্যই শিরোনাম:

 struct line {
   int length;
   char contents[0];
 };
 
 struct line *thisline = (struct line *)
   malloc (sizeof (struct line) + this_length);
 thisline->length = this_length;

আইএসও সি 99 এ আপনি একটি নমনীয় অ্যারে সদস্য ব্যবহার করবেন, যা সিনট্যাক্স এবং শব্দার্থবিজ্ঞানের তুলনায় কিছুটা পৃথক:

  • নমনীয় অ্যারে সদস্যদের 0 হিসাবে লিখিত হয় []]।
  • নমনীয় অ্যারে সদস্যদের অসম্পূর্ণ প্রকার রয়েছে এবং তাই আকারের অপারেটর প্রয়োগ করা যাবে না।

একটি বাস্তব বিশ্বের উদাহরণস্বরূপ শূন্য দৈর্ঘ্যের অ্যারে হয় struct kdbus_itemমধ্যে kdbus.h (লিনাক্স কার্নেল মডিউল)।


2
আইএমএইচও, স্ট্যান্ডার্ডের শূন্য দৈর্ঘ্যের অ্যারে নিষিদ্ধ করার কোনও ভাল কারণ নেই; এতে কোনও কাঠামোর সদস্য হিসাবে শূন্য আকারের অবজেক্ট থাকতে পারে এবং void*পাটিগণিতের উদ্দেশ্যে বিবেচনা করা হত (সুতরাং শূন্য-আকারের বস্তুগুলিতে পয়েন্টার যুক্ত বা বিয়োগ নিষিদ্ধ হবে)। নমনীয় অ্যারে সদস্যরা শূন্য আকারের অ্যারেগুলির চেয়ে বেশিরভাগ ক্ষেত্রে আরও ভাল, তারা নিম্নলিখিত বিষয়গুলিতে "সিনট্যাকটিক" ইন্ডিরিয়ারেশনের অতিরিক্ত স্তরের যোগ না করেও উলামের জিনিসগুলিতে "ইউনিয়ন" হিসাবে কাজ করতে পারে (যেমন প্রদত্ত struct foo {unsigned char as_bytes[0]; int x,y; float z;}ব্যক্তি সদস্যদের অ্যাক্সেস করতে পারে x.. z...
সুপারক্যাট

... সরাসরি যেমন myStruct.asFoo.x, ইত্যাদি না বলেই সরাসরি , আইআইআরসি, সি কোনও কাঠামোর মধ্যে নমনীয় অ্যারে সদস্যকে অন্তর্ভুক্ত করার জন্য কোনও প্রচেষ্টা করতে গিয়ে এই কাঠামোকে অসম্ভব করে তোলে যার মধ্যে জ্ঞাত দৈর্ঘ্যের একাধিক অন্যান্য নমনীয়-অ্যারে সদস্য রয়েছে making বিষয়বস্তু।
সুপারক্যাট

@ সুপের্যাট একটি ভাল কারণ হ'ল বাইরের অ্যারে সীমা অ্যাক্সেস সম্পর্কে নিয়মের সততা বজায় রাখা। কোনও কাঠামোর শেষ সদস্য হিসাবে, সি 99 নমনীয় অ্যারে সদস্য জিসি শূন্য-আকারের অ্যারের মতো ঠিক একই প্রভাব অর্জন করে, তবে অন্যান্য নিয়মে বিশেষ কেস যুক্ত করার প্রয়োজন ছাড়াই। আইএমএইচও এটি একটি উন্নতি যা sizeof x->contentsআইএসসি সি-তে একটি ত্রুটি হিসাবে জিসিসি-তে 0 ফেরার বিরোধিতা করে। শূন্য-আকারের অ্যারেগুলি যে স্ট্রাক্ট সদস্য নয় তারা অন্যান্য সমস্যাগুলির একগুচ্ছ পরিচয় দেয়।
এমএম

@ এমএম: শূন্য আকারের বস্তুতে দুটি সমান পয়েন্টার বাদ দিয়ে শূন্য-সমান বস্তুতে সমান পয়েন্টার বিয়োগ করে এবং শূন্য-আকারের অবজেক্টগুলিতে অসম পয়েন্টার বিয়োগফলকে ফলনকারী হিসাবে সংজ্ঞায়িত করা হলে তারা কী সমস্যা করবে? অনির্ধারিত মান? যদি স্ট্যান্ডার্ডটি নির্দিষ্ট করে দেয় যে একটি বাস্তবায়ন একটি এফএএম সমন্বিত একটি কাঠামোকে অন্য কাঠামোর মধ্যে এম্বেড করার অনুমতি দিতে পারে তবে শর্ত থাকে যে পরের স্ট্রাক্টের পরবর্তী উপাদানটি হয় ফ্যামের মতো একই উপাদান টাইপের একটি অ্যারে বা এই জাতীয় অ্যারে দিয়ে শুরু করা স্ট্রাক্ট , এবং এটি সরবরাহ করেছে ...
সুপারক্যাট

... এটি অ্যারে aliasing হিসাবে এফএএম স্বীকৃত (যদি প্রান্তিককরণের নিয়মগুলি অ্যারেগুলিকে বিভিন্ন অফসেটে নিয়ে যেতে পারে, তবে ডায়াগনস্টিকের প্রয়োজন হবে), এটি খুব কার্যকর হত। যেমনটি হ'ল, এমন কোনও উপায় নেই যা সাধারণ বিন্যাসের কাঠামোর দিকে নির্দেশক গ্রহণ করেstruct {int n; THING dat[];} এবং স্থির বা স্বয়ংক্রিয় সময়কালের জিনিসগুলির সাথে কাজ করতে পারে।
সুপারক্যাট

6

স্ট্রোকের মধ্যে শূন্য-আকারের অ্যারে ঘোষণাগুলি কার্যকর হবে যদি তাদের অনুমতি দেওয়া হয়, এবং শব্দার্থবিজ্ঞানগুলি যদি এমন হয় যে (1) তারা প্রান্তিককরণ বাধ্য করবে তবে অন্যথায় কোনও স্থান বরাদ্দ করবে না, এবং (2) অ্যারেটিকে সূচীকরণটি সংজ্ঞায়িত আচরণ হিসাবে বিবেচিত হবে ক্ষেত্রে যেখানে ফলাফল পয়েন্টারটি স্ট্রাক্টের মতো মেমরির একই ব্লকের মধ্যে থাকবে। এই জাতীয় আচরণ কখনও কোনও সি স্ট্যান্ডার্ড দ্বারা অনুমোদিত ছিল না, তবে কিছু পুরানো সংকলক এটি খালি বন্ধনী সহ অসম্পূর্ণ অ্যারে ঘোষণার অনুমতি দেওয়ার জন্য মানক হওয়ার আগে এটির অনুমতি দেয়।

স্ট্রাক হ্যাক, সাধারণত 1 মাপের একটি অ্যারের ব্যবহার করে প্রয়োগ করা, ডজ এবং এটি আমার মনে হয় না যে কোনও প্রয়োজনীয়তা রয়েছে যা সংকলকরা এটি ভাঙ্গা থেকে বিরত থাকে। উদাহরণস্বরূপ, আমি আশা যে একটি কম্পাইলার দেখেন int a[1], এটা বিবেচনা তার অধিকারের মধ্যে হতে হবে a[i]যেমন a[0]। যদি কেউ স্ট্রাক হ্যাকের প্রান্তিককরণের সমস্যাগুলি নিয়ে কাজ করার চেষ্টা করে তবে

টাইপডেফ স্ট্রাক্ট
  uint32_t আকার;
  uint8_t ডেটা [4]; // প্যাডিং স্ট্রাক্টের আকারটি ফেলে দেওয়া এড়ানোর জন্য চারটি ব্যবহার করুন
}

একটি সংকলক চালাক পেতে পারে এবং ধরে নিতে পারে অ্যারের আকারটি সত্যই চারটি:

; যেমন লেখা আছে
  foo = myStruct-> ডেটা [i];
; যেমন ব্যাখ্যা করা হয়েছে (স্বল্প-এডিয়ান হার্ডওয়্যার অনুমান করে)
  foo = ((* (uint32_t *) myStruct-> ডেটা)) >> (i << 3)) & 0xFF;

যেমন একটি অপ্টিমাইজেশন যুক্তিসঙ্গত হতে পারে, বিশেষত যদি myStruct->dataএকই ক্রিয়াকলাপ একটি রেজিস্টার মধ্যে লোড করা যেতে পারে myStruct->size। আমি এমন স্ট্যান্ডার্ডে কিছুই জানি না যা এই ধরনের অপ্টিমাইজেশন নিষিদ্ধ করবে, যদিও অবশ্যই এটি এমন কোনও কোড ভঙ্গ করবে যা চতুর্থ উপাদানটির বাইরে স্টাফ অ্যাক্সেসের আশা করতে পারে।


1
নমনীয় অ্যারের সদস্য struct হয় হ্যাক এর একটা ন্যায়সঙ্গত সংস্করণ হিসেবে C99 যোগ করা হয়েছিল
এম এম

স্ট্যান্ডার্ডটি বলে যে বিভিন্ন অ্যারে সদস্যদের অ্যাক্সেসগুলি বিরোধ নয়, যা সেই অপ্টিমাইজেশনটিকে অসম্ভব করে তুলবে।
বেন ভয়েগট

@ বেনভয়েগ্ট: সি ভাষার মানটি বাইট লেখার এবং শব্দটি একই সাথে পড়ার প্রভাব নির্দিষ্ট করে না তবে প্রসেসরের ৯৯.৯% উল্লেখ করে যে লেখাটি সফল হবে এবং শব্দটির সাথে নতুন বা পুরাতন সংস্করণ থাকবে অন্যান্য বাইটগুলির আনলটার্টড সামগ্রী সহ বাইট করুন। কোনও সংকলক যদি এই জাতীয় প্রসেসরের লক্ষ্যবস্তু করে, তবে বিরোধ কী হবে?
সুপারক্যাট

@ সুপের্যাট: সি ভাষার মানটি গ্যারান্টি দেয় যে একই সাথে দুটি ভিন্ন অ্যারে উপাদানগুলিকে লেখায় বিরোধ হয় না। সুতরাং আপনার যুক্তি যে (লেখার সময় পড়ুন) ঠিক কাজ করে, যথেষ্ট নয়।
বেন ভয়েগট

@ বেনওয়েগ্ট: যদি কোনও টুকরো কোডটি উদাহরণস্বরূপ অ্যারে উপাদানগুলিকে 0, 1, এবং 2 কে কিছু ধারাবাহিকভাবে লিখতে থাকে তবে চারটি উপাদানকে দীর্ঘায়িত করতে, তিনটি সংশোধন করতে এবং চারটিটি আবার লেখার অনুমতি দেওয়া হবে না, তবে আমি মনে হয় এটিকে চারটি দীর্ঘায়িত করার, তিনটি সংশোধন করার, সংক্ষিপ্ত আকারে 16 টি বিটগুলি আবার লিখতে এবং বাইট হিসাবে 16-23 বিট দেওয়ার অনুমতি দেওয়া হবে। আপনি কি এর সাথে একমত নন? এবং কোড যা অ্যারের উপাদানগুলি পড়ার প্রয়োজন ছিল কেবল তাদের দীর্ঘায়িতভাবে পড়তে এবং এটি ব্যবহার করার অনুমতি দেওয়া হবে।
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.