मैं निम्नलिखित तरीके से एक संरचना को परिभाषित करना चाहता हूं:

typedef struct Info_s
{
 uint8   Size;
 uint8   Address;
 uint8   Pattern[Size];    
}Info_t;

जैसा कि आप देख सकते हैं कि सरणी पैटर्न का आकार "आकार" है जिसे पहले उसी संरचना में घोषित किया गया है।

क्या वो सही है?

0
Stack Over 10 जिंदा 2018, 18:23

5 जवाब

सबसे बढ़िया उत्तर

एक संरचना क्षेत्र के रूप में घोषित एक सरणी में या तो उसके आकार के रूप में एक पूर्णांक स्थिर अभिव्यक्ति होनी चाहिए या बिना किसी आकार (uint8 Pattern[];) के लचीला सरणी सदस्य होना चाहिए। आपका संस्करण न तो है।

यदि आपके मामले में सरणी आकार रन-टाइम मान है, तो आपके पास दो विकल्प हैं

  1. लचीला सरणी सदस्य uint8 Pattern[];, जिसके परिणामस्वरूप "फ्लैट" संरचना होगी। वांछित लंबाई की सरणी के साथ पूरी संरचना को समायोजित करने के लिए उचित मात्रा में स्मृति को malloc मैन्युअल रूप से आवंटित करना होगा।

  2. सूचक सदस्य uint8 *Pattern;, इस स्थिति में आपकी संरचना दो-स्तरीय हो जाएगी। संरचना के लिए मेमोरी और सरणी के लिए मेमोरी आम तौर पर स्वतंत्र रूप से आवंटित दो अलग-अलग मेमोरी ब्लॉक बन जाएंगे।

एक लचीला सरणी सदस्य आम तौर पर एक बेहतर विचार है (और आपके स्पष्ट मूल इरादे से मेल खाता है), जब तक कि आपके पास कुछ अन्य आवश्यकताएं न हों जो उस अपमान को रोक दें।

5
AnT 11 जिंदा 2018, 19:53

आप ऐसा नहीं कर सकते। यानी नियम का उल्लंघन है। कोड संकलित करें और आप इसे स्पष्ट रूप से जान पाएंगे।

इसके बजाय uint8* रखें और फिर Size के मान के आधार पर इसे मेमोरी (malloc,realloc आदि का उपयोग करके) आवंटित करें।

और अब यदि आप Size के मान को बढ़ाते या घटाते हैं, तो अपनी मेमोरी को फिर से आवंटित करें।

हां इसके साथ, जब आप इसके साथ काम कर रहे हों तो आपको गतिशील रूप से आवंटित स्मृति को मुक्त करना होगा।

2
user2736738 10 जिंदा 2018, 18:25

Pattern की घोषणा में बस सरणी आकार Size को हटा दें और आपको एक लचीली सरणी सदस्य के साथ संरचना की वैध घोषणा मिल जाएगी। :)

typedef struct Info_s
{
 uint8   Size;
 uint8   Address;
 uint8   Pattern[];    
}Info_t;
2
Vlad from Moscow 10 जिंदा 2018, 18:30

सहमति देना

uint8*   Pattern;

और Size ज्ञात हो जाने पर इसका आकार आवंटित करने के लिए malloc का उपयोग करें।

1
sjsam 10 जिंदा 2018, 18:26

यदि आप संरचना को गतिशील रूप से स्मृति आवंटित करना चाहते हैं, तो आप इसे निम्न तरीके से कर सकते हैं:

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;
}

आप https://www.programiz.com/ भी देख सकते हैं। अधिक जानकारी के लिए c-प्रोग्रामिंग/उदाहरण/संरचना-गतिशील-मेमोरी-आवंटन

1
Abhishek Koranne 10 जिंदा 2018, 18:42