कोड1

#include "header.h"
#define MAX_BUFFER 100
typedef struct node node_t;
typedef struct node{
    int data;
    node_t* next;
}node_t;
node_t* head = (node_t*)malloc(sizeof(node_t));
....
void insert(node_t** first, int n);

कोड 2

#include "header.h"
#define MAX_BUFFER 100
typedef struct node node_t;
typedef struct node{
    int data;
    node_t* next;
}node_t;
node_t* head = NULL;
void insert(node_t** first, int n);
...
void insert(node_t** first, int n)
{
    node_t* new_node = (node_t*)malloc(sizeof(node_t));
}

जब मैं कोड 1 संकलित करता हूं, तो त्रुटि होती है और यह कहती है


llist.c:10:16: error: initializer element is not a compile-time constant
node_t* head = (node_t*)malloc(sizeof(node_t));
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.

और कोड 2, कोई त्रुटि नहीं हुई।

मुझे संकलन-समय स्थिरांक का अर्थ नहीं मिलता है। क्या कोई मुझे बता सकता है कि कोड 1 में त्रुटि क्यों होती है?

0
강찬희 20 सितंबर 2020, 16:03

2 जवाब

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

निश्चित रूप से किसी फ़ंक्शन के लिए कॉल के साथ वैश्विक चर प्रारंभ करना इसे प्रारंभ करने के लिए कोड निष्पादित करने की आवश्यकता होती है, जो लोड समय पर संभव नहीं है, क्योंकि वैश्विक चर प्रारंभकर्ता मान पहले से लोड फ़ाइल में एन्कोड किए गए हैं, क्योंकि इनिशियलाइज़्ड .data सेक्शन (यही कारण है कि इनिशियलाइज़र को स्थिरांक की आवश्यकता होती है) किसी फ़ंक्शन के लिए कॉल कभी भी एक निरंतर एक्सप्रेशन नहीं होता है, इसका रिटर्न वैल्यू एक पॉइंटर होता है, जो आंतरिक स्थिति पर निर्भर करता है। malloc() पुस्तकालय, इसलिए इसे निष्पादन योग्य फ़ाइल में कुछ निश्चित मान के रूप में एन्कोड नहीं किया जा सकता है।

लेकिन आप इसे NULL में प्रारंभ कर सकते हैं, और फिर किसी बिंदु पर परीक्षण कर सकते हैं यदि इसका मान NULL है, तो इसे प्रारंभ करें। लेकिन हमेशा कुछ कोड निष्पादित होने के बाद।

0
Luis Colorado 20 सितंबर 2020, 22:36

शीर्ष-स्तर पर आप malloc के साथ आरंभ नहीं कर सकते।

शीर्ष-स्तर पर आपको केवल स्थिर डेटा का उपयोग करने की आवश्यकता होती है, उदाहरण के लिए,

node_t head = { ... };

और आप स्टैटिक इनिशियलाइज़र से भरते हैं, जैसे { some_int, NULL} या { some_int, &other_static_node }। या ऐसा कुछ:

node_t *head = NULL;

और आप इनिशियलाइज़ेशन फ़ंक्शन से head = malloc(sizeof(node_t)); का उपयोग करके head को इनिशियलाइज़ करते हैं। ध्यान दें, मैं malloc का आउटपुट कास्ट नहीं करता।

2
alinsoar 20 सितंबर 2020, 16:05