मैं निम्नलिखित तरीके से एक संरचना को परिभाषित करना चाहता हूं:
typedef struct Info_s
{
uint8 Size;
uint8 Address;
uint8 Pattern[Size];
}Info_t;
जैसा कि आप देख सकते हैं कि सरणी पैटर्न का आकार "आकार" है जिसे पहले उसी संरचना में घोषित किया गया है।
क्या वो सही है?
5 जवाब
एक संरचना क्षेत्र के रूप में घोषित एक सरणी में या तो उसके आकार के रूप में एक पूर्णांक स्थिर अभिव्यक्ति होनी चाहिए या बिना किसी आकार (uint8 Pattern[];
) के लचीला सरणी सदस्य होना चाहिए। आपका संस्करण न तो है।
यदि आपके मामले में सरणी आकार रन-टाइम मान है, तो आपके पास दो विकल्प हैं
लचीला सरणी सदस्य
uint8 Pattern[];
, जिसके परिणामस्वरूप "फ्लैट" संरचना होगी। वांछित लंबाई की सरणी के साथ पूरी संरचना को समायोजित करने के लिए उचित मात्रा में स्मृति कोmalloc
मैन्युअल रूप से आवंटित करना होगा।सूचक सदस्य
uint8 *Pattern;
, इस स्थिति में आपकी संरचना दो-स्तरीय हो जाएगी। संरचना के लिए मेमोरी और सरणी के लिए मेमोरी आम तौर पर स्वतंत्र रूप से आवंटित दो अलग-अलग मेमोरी ब्लॉक बन जाएंगे।
एक लचीला सरणी सदस्य आम तौर पर एक बेहतर विचार है (और आपके स्पष्ट मूल इरादे से मेल खाता है), जब तक कि आपके पास कुछ अन्य आवश्यकताएं न हों जो उस अपमान को रोक दें।
आप ऐसा नहीं कर सकते। यानी नियम का उल्लंघन है। कोड संकलित करें और आप इसे स्पष्ट रूप से जान पाएंगे।
इसके बजाय uint8*
रखें और फिर Size
के मान के आधार पर इसे मेमोरी (malloc
,realloc
आदि का उपयोग करके) आवंटित करें।
और अब यदि आप Size
के मान को बढ़ाते या घटाते हैं, तो अपनी मेमोरी को फिर से आवंटित करें।
हां इसके साथ, जब आप इसके साथ काम कर रहे हों तो आपको गतिशील रूप से आवंटित स्मृति को मुक्त करना होगा।
Pattern
की घोषणा में बस सरणी आकार Size
को हटा दें और आपको एक लचीली सरणी सदस्य के साथ संरचना की वैध घोषणा मिल जाएगी। :)
typedef struct Info_s
{
uint8 Size;
uint8 Address;
uint8 Pattern[];
}Info_t;
सहमति देना
uint8* Pattern;
और Size
ज्ञात हो जाने पर इसका आकार आवंटित करने के लिए malloc
का उपयोग करें।
यदि आप संरचना को गतिशील रूप से स्मृति आवंटित करना चाहते हैं, तो आप इसे निम्न तरीके से कर सकते हैं:
struct Info_s
{
uint8 Address;
uint8 Pattern[Size];
};
int main()
{
struct Info_s *no;
int i, noOfRecords;
printf("Enter no: ");
scanf("%d", &noOfRecords);
no=(struct Info_s*) malloc (noOfRecords * sizeof(struct course));
for(i=0;i<noOfRecords;++i)
{
scanf(...);
}
.
.
.
return 0;
}