2012-08-31 35 views
9

मैं कोड की निम्न पंक्ति के बारे में उलझन में हूँ:सरणी सरणियों चार को

char* words[] = { "aaa", "bbbb", "ccccc", "dddddd" }; 

तरह से मैं समझता हूँ, प्रत्येक शब्द पहले संग्रहीत किया जाता है और उसके बाद सरणी words की प्रत्येक स्थिति पहले तो इंगित करेगा प्रत्येक शब्द का चरित्र। इन तारों को कैसे संग्रहीत किया जाता है? क्या यहां गतिशील आवंटन चल रहा है या क्या ये शब्द ढेर पर संग्रहीत हैं?

यदि वे ढेर पर संग्रहीत हैं, तो वे किस तरह से संग्रहीत हैं? उदाहरण के लिए, अगर मैं नीचे के रूप में words की सामग्री में से कुछ प्रिंट:

#include <stdio.h> 
int main() { 
    char* words[] = { "aaa", "bbbb", "ccccc", "dddddd" }; 
    printf("\n\n(*words)[0] = %s", words[0]); 
    printf("\n\n(*words)[0]+1 = %s", words[0]+1); 
    return 0; 
} 
बजाय मुद्रण aaa और bbbb की

, मैं क्या मिल aaa और aa है। मैं वास्तव में समझ नहीं पा रहा हूं कि इसके कारण क्या है, जिस तरह से मैं इसे देखता हूं, words[0]+1 स्ट्रिंग bbbb को इंगित करना चाहिए और aaa के दूसरे अक्षर पर नहीं होना चाहिए। यहाँ क्या हो रहा है?

+0

आप भ्रमित 'शब्द हैं [0] + 1',' (शब्द +1) [0] 'और' शब्द [1] '? –

+0

'और शब्द [0] + 1' – oldrinb

उत्तर

2

तरह से मैं इसे देख, शब्द [0] +1 स्ट्रिंग bbbb इशारा करना चाहिए और न aaa के दूसरे चरित्र

सं words[0] एक चार सूचक ही है करने के लिए कि आपको इसे जोड़ने के द्वारा "aaa" का दूसरा अक्षर मिलता है। आप क्या चाहते हैं words + 1 या &words[0] + 1 जो सही ढंग से "बीबीबीबी" होगा।

इसके अलावा, स्ट्रिंग्स को निष्पादन योग्य लॉन्च करने पर आवंटित किया जाता है और संभवतः वे लिंकर द्वारा बाइनरी के डेटा या बीएसएस अनुभाग में डाल दिए जाते हैं। साथ ही, जब आप words घोषित करते हैं और प्रारंभ करते हैं, तो इसे किसी भी अन्य स्वचालित सरणी के रूप में स्टैक पर आवंटित किया जाएगा और इसकी वस्तुओं को प्रत्येक स्ट्रिंग निरंतर की शुरुआत में पॉइंटर्स को असाइन किया जाएगा।

+0

देखें I मैंने वास्तव में 'bbbb' को 'bubb' में बदलने के लिए' शब्द [1] [1] = 'u''' जैसी चीजों को करने का प्रयास किया, लेकिन' bbbb' इसे बदलने के बाद ही रहता है (!)। क्या ऐसा इसलिए है क्योंकि तार केवल पढ़े जाते हैं (मुझे लगता है कि वे हैं क्योंकि वे राजस्व हैं)? –

+0

@curvature हाँ वे हैं। खुश रहें कि यह क्रैश नहीं हुआ - स्ट्रिंग स्थिरांक संशोधित करना यूबी है। –

3

शब्द [0] "aaa" में पहले 'ए' को इंगित करता है।

शब्द [0] +1 उस चरित्र को एक वर्ण के साथ ले जाता है, इसलिए यह दूसरे 'ए' पर इंगित करता है।

शब्द [1] "bbbb"

शब्द [1] +1 अंक "bbb", जैसे कम अंक "बीबीबीबी" में दूसरा 'बी'।

0

शब्द [0] aaa का पता देता है। दूसरे को इंगित करने के लिए पते को बढ़ाने के लिए 1 जोड़ना।

क्या आपके पास शब्द [0 + 1] होना चाहिए?

आपको वह चीज़ देनी चाहिए जो आप उम्मीद कर रहे हैं।

0
char* words[] = { "aaa", "bbbb", "ccccc", "dddddd" }; 

सभी 4 तारों में स्थिर भंडारण अवधि होती है और प्रोग्राम स्टार्टअप से पहले आवंटित की जाती है।

प्रारंभकर्ता में, सरणी को पॉइंटर्स में char में परिवर्तित कर दिया गया है और words सरणी सूचक मानों के साथ प्रारंभ की गई है।

1

शाब्दिक स्मृति स्थिर अक्षर में संग्रहीत हैं। उनका वास्तविक स्थान कार्यान्वयन-निर्भर है लेकिन शाब्दिक तार कहीं संग्रहीत किए जाते हैं, आमतौर पर निष्पादन योग्य के डेटा हिस्से में - यह न तो गतिशील है और न ही आवंटन ढेर है। आपके सरणी में इन स्थानों पर पॉइंटर्स होते हैं।

शब्द [0] +1 स्ट्रिंग बीबीबीबी को इंगित करना चाहिए, न कि एए के दूसरे चरित्र के लिए।

यह बस सरणी अनुक्रमण कार्य कैसे करता है यह नहीं है। आप words[0] के साथ तारों की सरणी को अनुक्रमित करते हैं, अब आपके पास एक स्ट्रिंग है, और कोई भी स्ट्रिंग उस स्ट्रिंग पर लागू होती है। आप सबस्क्रिप्ट के बाहर सरणी सूचकांक के साथ अंकगणित नहीं कर सकते हैं। स्ट्रिंग "bbbb" पर जाने के लिए, आप words[1] का उपयोग करेंगे।

6

अंतर यह है क्योंकि words[0]+1words[0+1] जैसा नहीं है।

words[0] में दूसरे वर्ण के पूर्व अंक, जबकि बाद वाले दूसरे शब्द को इंगित करते हैं। यह बिल्कुल ठीक है -

1

दोनों ढेर और ढेर अंतरिक्ष गतिशील रूप से आवंटित किए गए हैं - यानी, उन्हें रन टाइम पर आवंटित किया जाता है। ढेर या ढेर पर, आपका संकलित कोड गतिशील रूप से आवंटित किया गया है? जाहिर है न तो। स्थिरांक के लिए भंडारण कोड के लिए भंडारण के समान है ... वे डिस्क पर निष्पादन योग्य में संग्रहीत हैं और केवल पढ़ने योग्य स्मृति में लोड किए गए हैं। (पैडेंट्स के लिए नोट: इस तरह एक सामान्य कार्यान्वयन में चीजें की जाती हैं; यह भाषा मानक द्वारा अनिवार्य नहीं है।)

words[0] "aaaa" के पहले 'ए' का पता है। उस पते को 1 जोड़ना निश्चित रूप से "aaaa" के दूसरे 'ए' के ​​पते को प्राप्त करना चाहिए। "बीबीबीबी" का पता words[1] पर है।

आपके printf के प्रारूप में आपके पास "(* शब्द) [0]" है, लेकिन यह अलग है। *wordswords[0] जैसा ही है। (*words)[0]**words जैसा ही है, जो "aaaa" का पहला 'ए' (इसका पता नहीं) है। आप %c के साथ प्रिंट करेंगे, %s नहीं।

15

इस तरह है ..

enter image description here

शब्द के बाद से संकेत के चरित्र की एक सरणी तो शब्दों में से प्रत्येक सरणी सूचकांक स्ट्रिंग शाब्दिक, यानी की पते का आयोजन करेगा। स्ट्रिंग शाब्दिक के आधार का पता अगर आप प्रिंट होगा

printf("%s",words[0])// index 0 will print aaa. 
संबंधित मुद्दे