2011-12-01 10 views
8

मेरे पास नीचे कोड है।सी आवंटित पॉइंटर्स? यह क्या है?

char a[] = "abcde"; 
char *b = "fghij"; 
char *c = malloc(6); 
char *d = c; 
c = "klmno"; 

और व्यायाम कहता है:

डेटा संरचनाओं क, ख, ग और घ (सामग्री के साथ), की एक तस्वीर ड्रा आप देख सकते हैं, जहां क्या आबंटित किया गया है और करने के लिए उपयोग तीर दिखाएं कि पॉइंटर्स सेट हैं।

मेरे समाधान है:

 ____________ 
a -> |a|b|c|d|e|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ____________ 
b -> |f|g|h|i|j|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ____________ 
c -> |k|l|m|n|o|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ___________ 
d -> | | | | | | | 
     ¨¨¨¨¨¨¨¨¨¨¨ 

हालांकि मेरी समाधान स्वीकार नहीं मिला और जवाब था "एक सूचक ख के लिए आबंटित स्मृति, सी, डी, लेकिन एक नहीं"। क्या कोई मुझे बता सकता है इसका क्या अर्थ है?

+0

यह आपके प्रश्न से अस्पष्ट है कि आपका उत्तर क्या था और इसमें क्या गलत था। कृपया इसे और अधिक समझने योग्य बनाने के लिए इसे फिर से लिखने का प्रयास करें। – Neowizard

+2

@karlphillip, सी भरा नहीं था, इसे फिर से सौंप दिया गया था। – Neowizard

+0

नहीं, 'सी' की सामग्री ** नहीं ** **' d' पर कॉपी की गई है। –

उत्तर

9

यह थोड़ा सा प्रतिक्रियात्मक प्रतिक्रिया है, लेकिन मुझे लगता है कि शिकायत यह है कि सरणी a उस डेटा पर बिंदु नहीं है; यह में डेटा शामिल है।

तो यह हो सकता है क्या (सूचक तीर के बिना) की आवश्यकता है:

____________ 
a |a|b|c|d|e|\0| 
    ¨¨¨¨¨¨¨¨¨¨¨¨ 

एक सरणी के नाम सूचक के रूप में इस्तेमाल किया जा सकता है, लेकिन यह अभी भी एक बड़ी चालाकी से अलग अर्थ नहीं है।

+0

हां यही मैंने सोचा था। हालांकि सरणी अनिवार्य रूप से केवल पहले तत्व के लिए एक सूचक नहीं है? – Pithikos

+2

किसी सरणी का नाम उस सरणी के पहले तत्व को इंगित करता है। यह इस अर्थ में एक सूचक है। – karlphillip

+4

ऐसा लगता है कि वे [इस] (http://c-faq.com/aryptr/aryptr2.html) जैसी तस्वीर चाहते थे। –

7

मैं उन्हें इस तरह आकर्षित होगा:

 ____________ 
    |a|b|c|d|e|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
      a 
     ____________ 
b -> |f|g|h|i|j|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     ____________ 
c -> |k|l|m|n|o|\0| 
     ¨¨¨¨¨¨¨¨¨¨¨¨ 
     _____________ 
d -> |g|a|r|b|a|g|e| 
     ¨¨¨¨¨¨¨¨¨¨¨¨¨ 

सूचना कैसे a, एक तीर के बगल में नहीं पूरे सरणी के नीचे है। यह जोर देना है कि a एक संपूर्ण सरणी है जिसमें केवल एक सूचक नहीं है, केवल स्ट्रिंग है। इससे पता चलता है कि आप सर और पॉइंटर के बीच अंतर का एहसास करते हैं।

+0

मैं इस तरह से 'ए' नहीं खींचूंगा। यह __is__ एक सूचक –

+3

@Andrey: नहीं, यह नहीं है। एक सरणी और एक सूचक के बीच एक अलग अंतर है। हालांकि सरणी पहचानकर्ता कुछ संदर्भों में एक सूचक के लिए क्षय हो जाते हैं, जो उन्हें पॉइंटर्स नहीं बनाता है। 'आकार (ए)' और 'आकार (बी)' का प्रयास करें और अपने लिए अंतर देखें। –

+0

हां, आप इस बिंदु पर सही हैं। लेकिन वास्तव में यह वास्तव में यहां कोई फर्क नहीं पड़ता, मुझे लगता है। –

1

d द्वारा इंगित स्मृति की सामग्री वास्तव में निर्धारित नहीं है। इसमें malloc() से malloc()c

1

पर भी अंतर होना चाहिए, मैं यह भी समझने की कोशिश करता हूं कि डेटा कहां रहता है।

____________ 
a|a|b|c|d|e|\0| (in data segment or on stack) 
    ¨¨¨¨¨¨¨¨¨¨¨¨ 
    _____  ____________ 
b|ptr->| -> |f|g|h|i|j|\0| (in rodata) 
    ¨¨¨¨¨  ¨¨¨¨¨¨¨¨¨¨¨¨ 
    _____  ____________ 
c|ptr->| -> |k|l|m|n|o|\0| (in rodata) 
    ¨¨¨¨¨  ¨¨¨¨¨¨¨¨¨¨¨¨ 
    _____  ___________ 
d|ptr->| -> |X|X|X|X|X|X| (on heap) 
    ¨¨¨¨¨  ¨¨¨¨¨¨¨¨¨¨¨ 
1

मुझे लगता है कि आप काफी ठीक कह रहे हैं:

char a[] = "abcde"; 
    printf("a[]: [%s] length:%d\n", a, strlen(a)); 

    char* b = "fghij"; 
    printf("*b: [%s] length:%d\n", b, strlen(b)); 

    char* c = (char*)malloc(6); 
    char* d = c; 

    c = "klmno"; 
    printf("*d = c: d is [%s] length:%d\n", d, strlen(d)); 
    printf("*d = c: c is [%s] length:%d\n", c, strlen(c)); 

आउटपुट:

a[]: [abcde] length:5 
*b: [fghij] length:5 
*d = c: d is [] length:0 
*d = c: c is [klmno] length:5 

नोट: NULL चरित्र के लिए भी strlen() हालांकि खोजें पुनरावृति करने में सक्षम हो स्ट्रिंग्स और गिनती अक्षरों की एक सरणी पर,का ओकुरेंसखुद को अंतिम योग में जोड़ा नहीं गया है, यही कारण है कि यह 6 के बजाय 5 वर्णों की रिपोर्ट करता है।

जैसा कि आपके उत्तर को स्वीकार नहीं किया जा रहा है, संभवत: आपके शिक्षक की प्रस्तुति के कुछ अन्य रूप हैं जो आपको सरणी a के लिए करने की उम्मीद कर रहे थे, तो आप इसके बारे में अपने सहयोगियों से बात करने में रुचि रखते हैं, लेकिन मुझे नहीं लगता यह कहना उचित है कि आपने गलत जवाब दिया है।

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