मैं C विनिर्देश पढ़ रहा हूँ, जो 6.5 भाव में बताता है

अपने संग्रहीत मूल्य तक पहुंच के लिए किसी वस्तु का प्रभावी प्रकार वस्तु का घोषित प्रकार है, यदि कोई हो। यदि कोई मान किसी ऑब्जेक्ट में संग्रहीत किया जाता है जिसमें कोई घोषित प्रकार नहीं होता है, जिसमें एक प्रकार का एक प्रकार होता है जो एक वर्ण प्रकार नहीं होता है, तो लैवल्यू का प्रकार उस एक्सेस के लिए ऑब्जेक्ट का प्रभावी प्रकार बन जाता है और बाद में एक्सेस के लिए जो संशोधित नहीं करता है संग्रहीत मूल्य।

क्या कोई इसका अर्थ समझा सकता है? मुझे एक अस्पष्ट एहसास है कि इसका पॉइंटर्स और malloc() से लेना-देना है, लेकिन यह वह जगह है जहाँ तक मैं एक वकील की मदद के बिना प्राप्त कर सकता हूँ ...

उत्तर के आधार पर अपडेट करें: क्या मैं इसे सुरक्षित रूप से कर सकता हूं?

struct point {
    int x;
    int y;
};

int main() {
    int *x = malloc(1000);
    *x = 10;
    printf("%d\n", *x);

    struct point *p = x;
    p->x = 5;
    p->y = 10;
    printf("%d %d\n", p->x, p->y);
}

मुझे चेतावनी मिल रही है, लेकिन यह मेरे मामले में काम करता है। क्या यह काम करने की गारंटी है?

c
6
blue_note 20 जून 2019, 19:52

1 उत्तर

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

जब आप किसी दिए गए प्रकार का एक चर घोषित करते हैं, तो यह उस प्रकार की एक अंतर्निहित वस्तु को संदर्भित करता है, इसलिए वस्तु का प्रभावी प्रकार संबंधित चर का प्रकार होता है।

जहां चीजें थोड़ी अस्पष्ट हो जाती हैं, जब malloc चलन में आता है। malloc से लौटाई गई मेमोरी का कोई प्रभावी प्रकार नहीं है। उदाहरण के लिए:

int *x = malloc(sizeof(int));

मान लें कि int का आकार 4 बाइट्स है, x अब बिना किसी प्रभावी प्रकार के 4 बाइट्स मेमोरी की ओर इशारा करता है। असाइन किए जाने पर यह मेमोरी एक प्रभावी प्रकार प्राप्त करती है:

*x = 123;

अब उन बाइट्स का प्रभावी प्रकार int है।

आपके उदाहरण के मामले में, आप 1000 बाइट आवंटित करते हैं, और प्रारंभ में इन बाइट्स का कोई प्रभावी प्रकार नहीं होता है।

*x = 10;

यह पहले sizeof(int) को int प्रकार के ऑब्जेक्ट को बाइट करता है।

struct point *p = x;

इस चाहिए में एक कास्ट होनी चाहिए, लेकिन अंत में यह ठीक है क्योंकि struct point के पहले सदस्य का टाइप int है, और एक स्ट्रक्चर के लिए एक पॉइंटर इसके पहले सदस्य को इंगित करता है।

p->x = 5;

इसलिए यह सुरक्षित है, क्योंकि &p->x int प्रकार की किसी वस्तु की ओर इशारा करता है, जो कि अंतराल p->x के प्रकार से मेल खाता है।

p->y = 10;

यह भी सुरक्षित है, क्योंकि &p->y द्वारा इंगित बाइट्स में अभी तक एक प्रभावी प्रकार नहीं है, और असाइनमेंट अगले sizeof(int) बाइट्स को int प्रकार का ऑब्जेक्ट बनाता है।

7
dbush 20 जून 2019, 17:54