2012-06-06 5 views
8

जब मैं names आरंभ करने के लिए निम्न कोड में दूसरा विकल्प आज़माता हूं, तो मुझे सेगमेंटेशन गलती मिलती है। मुझे लगता है कि दूसरे विकल्प के साथ कुछ अवधारणात्मक रूप से गलत है। कोई विचार?कोई चार्ट पॉइंटर्स की सरणी के बजाय चार पॉइंटर्स पर पॉइंटर का उपयोग क्यों नहीं कर सकता?

char *names[] = { 
      "Alan", "Frank", 
      "Mary", "John", "Lisa" 
     }; 

char **names = { 
      "Alan", "Frank", 
      "Mary", "John", "Lisa" 
     }; 
+0

'char name [] =" एलन ";' 'char ** नाम = &name;' –

+0

शायद हमें बताएं कि आप ** में क्यों हैं। उनके तर्कों के माध्यम से कार्यों से वापसी के बगल में थोड़ा उपयोग होता है। –

+0

@Agent_L मैं "लर्न सी द हार्ड वे" (http://c.learncodethehardway.org/book/learn-c-the-hard-waych16.html) पुस्तक के साथ अनुसरण कर रहा था, जहां "रिवाइट" का अभ्यास है इस कार्यक्रम में सभी सरणी उपयोग ताकि यह पॉइंटर्स हो। " –

उत्तर

6

हां। पहले मामले में, आपके पास पॉइंटर्स की एक सरणी है। एक अलग आइटम के लिए प्रत्येक सूचक अंक (एलन, फ्रैंक ...)

दूसरी घोषणा

char **names; 

का तात्पर्य है कि नाम एक सूचक के लिए सूचक है [आप इस तरह तार का एक सेट प्रारंभ नहीं कर सकते हैं]।

char *str = "hello" 
char **names = &str; 
2

इसमें एक पूरी तरह से अलग स्मृति लेआउट है।

आपका पहला उदाहरण पॉइंटर्स की एक सरणी है। यह char * के आकार के 5 गुना पर कब्जा करता है।

आपका दूसरा उदाहरण, हालांकि, एक स्थान पर एक सूचक है जहां एक या अधिक char * की अपेक्षा की जा सकती है। इसे शुरू करने के तरीके को शुरू करना संभव नहीं है।

+0

धन्यवाद, दूसरे विकल्प –

+2

के लिए आरंभ करने का सही तरीका क्या होगा पहला तरीका सही तरीका है। चार ** नाम एक सरणी नहीं है। यह एक सूचक के लिए एक सूचक है और इस प्रकार मैंने ऊपर पोस्ट किए गए सूचक के पते को पकड़ सकते हैं। –

+0

@stressed_geek आपके पास एक सरणी (पहला तरीका) बिंदु '1 ** (दूसरा तरीका) हो सकता है। लेकिन सबसे पहले, आपको इसे प्रारंभ करना होगा। 'char * नाम [] = {...}; चार ** एन 2 = &names; 'जाने का एक तरीका हो सकता है ... – glglgl

2

पहले मामले में आपके पास char* की एक सरणी है। इसका मतलब है, आपने 5 char * चर (सरणी की प्रविष्टियों) के लिए स्मृति आवंटित की है, अच्छी तरह से स्मृति में एक दूसरे के बाद बैठे हैं। इसके अलावा, उनमें से प्रत्येक को प्रत्येक स्ट्रिंग की शुरुआत के लिए प्रारंभ किया जाता है।

दूसरे मामले में, आपके पास char ** प्रकार का एक सूचक है। आपके पास एक सूचक के लिए केवल पर्याप्त स्मृति है।

(मैं स्मृति प्रत्येक स्ट्रिंग के लिए आवंटित पर चर्चा को छोड़ दिया गया है। यह दोनों ही मामलों में एक ही हो सकता है लेकिन इसे यहाँ अप्रासंगिक है)

0

यह जीसीसी के साथ एक SEG गलती का कारण नहीं है। हालांकि एक पूर्णांक सरणी के साथ इस एक ही प्रयास कर संभवतः उदाहरण देकर स्पष्ट कर सकता है कारण है कि यह भावना का एक बहुत नहीं है:

char* names[] = { "Dennis", "Richie" }; 
char** more_names = { "Sarah", "O'connor" }; 

printf("Name: %s %s\n", names[0], names[1]); 
printf("Name: %s %s\n", more_names + 0, more_names + 1); 

int numbers[] = { 0, 1 }; 
int x = 2, y = 3; 
int* more_numbers = { &x, &y }; 

printf("Numbers: %d, %d\n", numbers[0], numbers[1]); 
printf("Numbers: %d, %d\n", *(more_numbers + 0), *(more_numbers + 1)); 

अजीब बात यह है कि इस उदाहरण वास्तव में पूर्णांक सरणी के लिए अपेक्षित परिणाम पैदा करता है। हालांकि जीसीसी एक चेतावनी उत्पन्न करता है।

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