2010-11-20 10 views
10

ट्रेलिंग ऐरे इडियॉम क्या है?ट्रेलिंग ऐरे इडियॉम

पीएस: इस शब्द को गुगल करने से वेक्टरों को पीछे की ओर सरणी मुहावरे का उपयोग करके कार्यान्वित किया जाता है, इस प्रकार वे वेक्टर ऑब्जेक्ट के पते को बदलने के बिना आकार बदलने योग्य नहीं होते हैं।

+0

जैसा कि अन्य ने नीचे दिए गए कुछ उत्तरों पर टिप्पणी की है, तो आपको _flexible array member_ की खोज करने के लिए बेहतर भाग्य होगा। – ninjalj

+0

ध्यान दें कि, सख्त परिभाषा के अनुसार, यह _UB_: http://stackoverflow.com/questions/3711233/is-the-struct-hack-technically-undefined- व्यवहार – sbi

उत्तर

10

आप अनुगामी सरणी मुहावरा में उल्लेख किया है इसका मतलब यह तो GCC source code (जहां आपकी बोली से आता है), यह वर्ष सी चाल का उल्लेख करने के लिए एक गतिशील सरणी लागू करने के लिए लगता है:

typedef struct { 
    /* header */ 
    size_t nelems; 

    /* actual array */ 
    int a[1]; 
} IntVector; 

जहां एक सरणी होगा

IntVector *make_intvector(size_t n) 
{ 
    IntVector *v = malloc(sizeof(IntVector) + sizeof(int) * (n-1)); 
    if (v != NULL) 
     v->nelems = n; 
    return v; 
} 
+3

यदि इसका जिक्र है, तो अधिक सामान्य शब्द [संरचना हैक] (http://stackoverflow.com/q/3711233/168225) है। –

+0

@ जॉर्ज: मुझे नहीं लगता (हालांकि मुझे यकीन नहीं है) यह अन्यथा शब्द का उल्लेख कर रहा है (जैसा आपने बताया है) 'स्ट्रक्चर हैक' का उपयोग 'ट्रेलिंग सरणी मुहावरे 'के स्थान पर किया जाएगा। –

+0

@ प्र्रासून: लेखक ने अभी एक अलग शब्द का उपयोग किया होगा, पहली बार ऐसा नहीं होगा। "स्ट्रक्चर हैक" वैसे भी थोड़ा अनौपचारिक लगता है। –

1

ऐसा लगता है कि structs में सरणी का संदर्भ है, जिसमें एक चरणीय सरणी आकार हो सकता है। देखें:

http://blogs.msdn.com/b/oldnewthing/archive/2004/08/26/220873.aspx और http://sourceware.org/gdb/current/onlinedocs/gdbint/Support-Libraries.html

एक और टिप, यदि आप एक अभिव्यक्ति के लिए गूगल में "अभिव्यक्ति डाल" की तरह "सरणी अनुगामी" इस आप अधिक विशिष्ट परिणाम प्राप्त होंगे। Google पीछे के सरणी के बारे में जानता है।

+0

+1 एमएसडीएन आलेख के लिंक के लिए +1, दिलचस्प सामग्री । –

1

के साथ बनाया मुझे लगता है कि क्या मतलब है:

struct foo { 
    ... some data members, maybe the length of bar ... 
    char bar[]; /* last member of foo, char is just an example */ 
}; 

इसका उपयोग malloc(sizeof(struct foo)+LEN) के साथ आवंटित करके किया जाता है, जहां एलईएन bar की वांछित लंबाई है। इस तरह से केवल एक मॉलोक की आवश्यकता है। [] का उपयोग केवल अंतिम संरचना सदस्य के साथ किया जा सकता है।

और, जैसा कि मैं जीसीसी दस्तावेज़, struct foo को समझता हूं, वैसे ही केवल (उचित रूप से) किसी अन्य संरचना के अंतिम सदस्य के रूप में उपयोग किया जा सकता है, क्योंकि भंडारण आकार निश्चित नहीं है - या सूचक के रूप में।

+0

इसे "लचीला सरणी सदस्य" कहा जाता है और सी 99 मानक (§6.7.2.1P16) में है। – aib

संबंधित मुद्दे