2013-07-10 9 views
8

के लिए स्मृति आवंटन मान लीजिए निम्नलिखित कोड:सी structs, सूचक और खेतों

struct c { 
    char* name; 
}; 

int main(int argc, char *argv[]) { 
    struct c c1; 
    c1.name = "Ana"; 
    printf ("%s\n",c1.name); 
    return 0; 
} 

मेरी पहली प्रतिक्रिया को लगता है कि मैं कुछ जगह आवंटित करने के लिए आवश्यक हो गया होता, या तो ढेर पर, या द्वारा एक स्पष्ट char name[] = "Anna" , लेकिन काम के ऊपर मेरा उदाहरण। क्या संकलक सिर्फ उस खंड को डेटा सेगमेंट में संग्रहीत कर रहा है और इसे इंगित करता है? दूसरे शब्दों में, यह है कि

struct c { 
    char* name = "Ana"; 
}; 

धन्यवाद।

उत्तर

8
struct c c1; 
c1.name = "Ana"; 

आप यहाँ स्मृति को आबंटित की जरूरत नहीं है, क्योंकि आप एक स्ट्रिंग शाब्दिक और स्ट्रिंग शाब्दिक सूचक c1.name बिंदु बना रहे हैं स्थिर भंडारण अवधि की है। डंक शाब्दिक स्टोर करने के लिए आवंटित किया जाता है और उसके बाद स्ट्रिंग शाब्दिक "Anna"सरणी name में नकल है क्योंकि इस मामले स्मृति में

char name[] = "Anna"; 

: इस के समान नहीं है। क्या आप struct काम c1.name = "Ana" के साथ क्या जब आप ऐसा करने के लिए इसी तरह की है:

char *name = "Anna"; 

अर्थात एक स्ट्रिंग के लिए सूचक बिंदु शाब्दिक हैं।

+1

+1 वास्तव में प्रश्न का उत्तर देने के लिए –

+2

ठीक है, मुझे लगता है कि मुझे यह मिल गया है। यह स्पष्ट करता है कि यह आपकी "स्थिर भंडारण अवधि" है, जिसका अर्थ है कि यह वास्तव में संकलन समय पर डेटा सेगमेंट में है, और उसके बाद संकलक स्पष्ट रूप से कहां इंगित करता है। धन्यवाद। –

3

मैं मैं क्या लगता है कि इस के रूप में

char *cThing; 
cThing = "Things!"; 

सिर्फ एक ही हो सकता है जहां printf("%s\n", cThing); फिर प्रिंट होगा सेल्सियस के लिए लेकिन से नया हूँ "सब कुछ!", को छोड़कर आप एक struct में सूचक की घोषणा कर रहे हैं।

+1

मैं आपको एक जीत बिंदु दे रहा हूं :) मुझे आश्चर्य है कि आपके पास अंतर्ज्ञान था, और इसे संवाद करने के लिए एक अच्छा सरल उदाहरण इस्तेमाल किया। बहुत बढ़िया :) –

संबंधित मुद्दे