सादा सी में अच्छी सुविधा है - शून्य प्रकार पॉइंटर्स, जिसे किसी भी डेटा प्रकार के सूचक के रूप में उपयोग किया जा सकता है।
लेकिन, मान मैं struct निम्नलिखित है:प्रकार शून्य शून्य
struct token {
int type;
void *value;
};
जहां मूल्य क्षेत्र सरणी चार के लिए, या int करने के लिए, या कुछ और जा सकते हैं।
तो जब इस संरचना के नए उदाहरण आवंटित करते हैं, तो मुझे चाहिए:
1) इस संरचना के लिए स्मृति आवंटित करें;
2) मूल्य के लिए स्मृति आवंटित करें और इसे मूल्य फ़ील्ड में असाइन करें।
मेरा प्रश्न है - "सरणी प्रकार शून्य" घोषित करने के तरीके हैं, जिन्हें शून्य सूचक जैसे किसी अन्य प्रकार में डाला जा सकता है?
मैं चाहता हूं कि किसी भी प्रकार कास्टिंग करने की क्षमता के साथ "लचीला सदस्य सरणी" (सी 99 मानक के 6.7.2.1 में वर्णित) का उपयोग करना है।
कुछ इस तरह:
struct token {
int type;
void value[];
};
struct token *p = malloc(sizeof(struct token) + value_size);
memcpy(p->value, val, value_size);
...
char *ptr = token->value;
मैं token- घोषित मान लें कि> चार या पूर्णांक सरणी और जरूरत प्रकार के कास्टिंग बाद में इस काम करेंगे, लेकिन किसी के लिए बहुत भ्रामक है जो इस पढ़ा जाएगा हो सकता है के रूप में मूल्य बाद में कोड वास्तव में आप अपने टाइपकास्ट करने के लिए उन p.value [सूचकांक] = somethings है
struct token {
int type;
void *value;
};
struct token p;
p.value = malloc(value_size);
p.value[0] = something;
p.value[1] = something;
...
संपादित करें,:
डबल पॉइंटर्स? 'Char []' का उपयोग करके –
ठीक इमो है, क्योंकि 'sizeof (char) == 1' और आप कभी आश्चर्यचकित नहीं होंगे। आप सही प्रकार के साथ 'p-> value' तक पहुंचने के लिए मैक्रोज़ पर विचार करना चाह सकते हैं। –