2012-06-24 19 views
8

मुझे आश्चर्य है कि मैं malloc को कॉल करते समय error: flexible array member not at end of struct त्रुटि क्यों प्राप्त कर रहा हूं। मेरे पास एक चर लंबाई लंबाई वाली संरचना है, और मुझे यह त्रुटि मिल रही है।संरचना त्रुटि के अंत में लचीला सरणी सदस्य का कारण क्या है?

struct है,

typedef struct { 
    size_t N; 
    double data[]; 
    int label[]; 
} s_col; 

और malloc के लिए कॉल है,

col = malloc(sizeof(s_col) + lc * (sizeof(double) + sizeof(int))); 

इस malloc करने के लिए सही कॉल है?

उत्तर

14

आप केवल एक संरचना में एक लचीला सरणी सदस्य हो सकते हैं, और यह हमेशा संरचना का अंतिम सदस्य होना चाहिए। दूसरे शब्दों में, इस मामले में आप malloc पर कॉल करने से पहले गलत हो गए हैं, इस बिंदु पर malloc को इस संरचना के लिए सही तरीके से कॉल करने का कोई तरीका नहीं है। कि इस हालांकि कुछ अलग है

struct my_pair { 
    double data; 
    int label; 
}; 

typedef struct { 
    size_t N; 
    struct my_pair data_label[]; 
}; 

नोट::

क्या आप (data और label सदस्यों में से एक ही नंबर के एरे), आप की तरह कुछ विचार कर सकते हैं चाहता हूँ लगता है ऐसा करने के लिए की एक सरणी के बजाय double s int एस की एक सरणी के बाद, यह आपको double की एक सरणी देता है जिसके बाद एक int, फिर अगले double, अगले int, और इसी तरह से। चाहे यह पर्याप्त है या नहीं, इस पर निर्भर करेगा कि आप डेटा का उपयोग कैसे कर रहे हैं (उदाहरण के लिए, एक बाहरी फ़ंक्शन को पास करने के लिए जो एक संगत सरणी की अपेक्षा करता है, आपको शायद अलग-अलग चीजें करना होगा)।

3
typedef struct { 
    size_t N; 
    double data[]; 
    int label[]; 
} s_col; 

आप बीच में लचीला सरणी सदस्य (double data[]) नहीं हो सकता। हार्डकोडेड सरणी आकार या double *data

+0

मुझे समझ में नहीं आ रहा है, मुझे सिखाया जाता है कि "टी * var" "टी var []" – spectre

+1

@ लुकाज़ 1 9 85 जैसा ही है: आप जो कहते हैं वह एक फ़ंक्शन तर्क के संदर्भ में सत्य है, जहां आप " एक सरणी manipulating तर्क "जो एक सूचक के माध्यम से तकनीकी रूप से लागू किया जाता है। आम तौर पर (यानी यहां) सरणी एक सरणी है, और सूचक एक सूचक है। – stan423321

2

एक संरचना परिभाषा और संरचना की शुरुआत के लिए एक सूचक को देखते हुए, यह आवश्यक है कि सी कंपाइलर किसी और चीज तक पहुंच के बिना संरचना के किसी भी सदस्य तक पहुंचने में सक्षम हो। चूंकि संरचना के भीतर प्रत्येक आइटम का स्थान पहले से मौजूद वस्तुओं की संख्या और प्रकारों द्वारा निर्धारित किया जाता है, किसी भी आइटम तक पहुंचने के लिए आवश्यक है कि सभी पिछली वस्तुओं की संख्या और प्रकार ज्ञात हों। विशेष मामले में जहां अंतिम आइटम एक सरणी है, किसी सरणी में किसी आइटम को एक्सेस करने के बाद इसमें कोई विशेष कठिनाई नहीं होती है, यह जानने की आवश्यकता होती है कि यह कहां से शुरू होता है (जिसमें से पहले आइटमों की संख्या और आइटम की संख्या के बजाय आइटम की संख्या की आवश्यकता होती है सरणी स्वयं), और आइटम इंडेक्स (जो संकलक सरणी आकार के बारे में कुछ भी जानने के बिना, वस्तुओं की संख्या से छोटे होने के लिए मान सकता है)। यदि एक फ्लेक्सिबल ऐरे सदस्य किसी संरचना के अंत के अलावा कहीं भी दिखाई देता है, हालांकि, इसके बाद वाले किसी भी आइटम का स्थान सरणी में आइटम्स की संख्या पर निर्भर करेगा - कुछ ऐसा करने वाला है जिसे संकलक नहीं जा रहा है।

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

  • कोई संबंधित समस्या नहीं^_^