2013-09-28 9 views
18

मैं एक प्रोग्राम लिखने की कोशिश कर रहा हूं जो पाठ फ़ाइल से तारों की एक श्रृंखला में पढ़ता है और इन्हें प्रत्येक तत्व के लिए गतिशील रूप से आवंटित करने वाले तारों की एक सरणी में संग्रहीत करता है। मेरी योजना प्रत्येक स्ट्रिंग को एक पॉइंटर का उपयोग करके सरणी में स्टोर करना था और उसके बाद सरणी आकार को और अधिक पढ़ा गया था। मुझे समझने में परेशानी हो रही है कि मेरा टेस्ट कोड नीचे क्यों काम नहीं कर रहा है। क्या यह एक व्यावहारिक विचार है?पॉइंटर सरणी के लिए गतिशील स्मृति आवंटन

char *aPtr; 
aPtr =(char*)malloc(sizeof(char)); 

aPtr[0]="This is a test"; 


printf("%s",aPtr[0]); 
+1

इसका कारण यह है कि आप 'एकल वर्ण के लिए malloc' अंतरिक्ष, और फिर आप एक' char' टाइप lvalue करने के लिए एक पूरी स्ट्रिंग आवंटित करने के लिए कोशिश काम नहीं करता। –

+0

अनुशंसित पढ़ने: [मुझे सी में malloc का उपयोग कब करना चाहिए और जब मैं नहीं?] (Http://stackoverflow.com/a/1963812/2455888)। – haccks

उत्तर

15

सी में एक स्ट्रिंग char* है। T के एक गतिशील सरणी को T पर पॉइंटर के रूप में दर्शाया गया है, इसलिए char* के लिए char** होगा, न कि char* जिस तरह से आपने इसे घोषित किया था।

संकलक, इसमें कोई संदेह नहीं है, इसके बारे में कुछ चेतावनियां जारी की गई हैं। इन चेतावनियों पर ध्यान दें, अक्सर वे आपको समझने में मदद करते हैं कि क्या करना है।

यहाँ कैसे आप अपने परीक्षण शुरू कर सकते हैं है:

char **aPtr; 
int len = 1; // Start with 1 string 
aPtr = malloc(sizeof(char*) * len); // Do not cast malloc in C 
aPtr[0] = "This is a test"; 
printf("%s",aPtr[0]); // This should work now. 
+0

सत्यापित करने के लिए (कृपया मेरे साथ भालू, मैं एक नौसिखिया =] हूं), यदि आप चारों ओर पॉइंटर्स की गतिशील सरणी चाहते थे (उदाहरण के लिए, एक ऐसे अनुप्रयोग में जरूरी है जहां आपको एक चर संख्या संख्या तारों को स्टोर करने की आवश्यकता हो, उदाहरण के लिए इसकी लंबाई जानने या अनिर्दिष्ट लंबाई के उपयोगकर्ता इनपुट एकत्र किए बिना एक टेक्स्ट फ़ाइल पढ़ना), तो आपको चार * की एक गतिशील सरणी की आवश्यकता होगी और इसलिए आपको एक char ** की आवश्यकता होगी। char ** विभिन्न वर्ण पॉइंटर्स को इंगित कर सकता है, जो विभिन्न वर्ण तारों का प्रारंभिक पता हो सकता है। –

+0

यहां के लिए 'len = 1' क्या है? ऐसा लगता है कि 'यह एक परीक्षण है' 14 वर्ण होंगे, जो प्रत्येक बाइट होगा .... लेकिन इस कोड में 14 का उल्लेख नहीं है, और न ही जब मैं दौड़ता हूं तो यह segfault करता है। – nmz787

+0

@ nmz787 'एपीआरटी' के प्रकार पर ध्यान दें, यह एक डबल पॉइंटर है, इसलिए चार पॉइंटर्स की एक सरणी का प्रतिनिधित्व करता है। एक चार सूचक तब तत्व शून्य में सेट किया जाता है; इस कोड में कोई स्ट्रिंग प्रतिलिपि नहीं हो रही है। – dasblinkenlight

5
char * aPtr; 

एक चरित्र के लिए सूचक, के रूप में है जिस पर आपको स्मृति आवंटित बिल्कुल 1 चरित्र धारण करने के लिए।

कर

aPrt[0] = "test"; 

आप इस एक पात्रों के लिए स्मृति का पता और इसे करने के लिए शाब्दिक "test" का पता स्टोर करने के लिए प्रयास करें। यह असफल हो जाएगा क्योंकि इस पते में सबसे अधिक पसंद एक चरित्र है।

आपके कोड में एक फिक्स एक चरित्र के लिए एक सूचक के लिए स्मृति आवंटित करना होगा।

char ** aPtr = malloc(sizeof(char *)); 
aPtr[0] = "test"; 
printf("%s", aPtr[0]); 

करके और अधिक सुरुचिपूर्ण और मजबूत दृष्टिकोण पर अधिक एक ही आवंटित करने के लिए किया जाएगा (और साथ ही अनिवार्य त्रुटि जाँच जोड़ने) कर रहे हैं:

char ** aPtr = malloc(sizeof *aPtr); 
if (NULL == aPtr) 
{ 
    perror("malloc() failed"); 
    exit(EXIT_FAILURE); 
} 

... 
9
char *str; //single pointer 

इस के साथ आप एक स्टोर कर सकते हैं स्ट्रिंग।


संग्रहीत करने के लिए array of strings आप की आवश्यकता two dimensional character array

वरना array of character pointers वरना double pointer


char str[10][50]; //two dimensional character array 

आप इस तरह की घोषणा यदि आप स्मृति को आबंटित के रूप में इस स्थिर घोषणा

है की जरूरत नहीं है
char *str[10]; //array of pointers 

यहाँ आप प्रत्येक सूचक

for(i=0;i<10;i++) 
str[i]=malloc(SIZE); 

char **str; //double pointer 

यहाँ आप की संख्या के लिए स्मृति को आबंटित करने की जरूरत है के लिए स्मृति को आबंटित करने वालों के माध्यम से एक सूचक के लिए स्मृति को आबंटित करने

पाश की जरूरत है पॉइंटर्स और फिर प्रत्येक पॉइंटर के लिए स्मृति आवंटित करें।

str=malloc(sizeof(char *)*10); 

और फिर सरणी के माध्यम से लूप प्रत्येक सूचक

for(i=0;i<10;i++) 
str[i]=malloc(SIZE); 
-1

आप इसे पूरी तरह से गलत कर रहे हैं के लिए स्मृति को आबंटित। आपके कोड का सही संस्करण इस तरह होना चाहिए:

int main() 
{ 
char *aPtr; 
aPtr =(char*)malloc(20*sizeof(char)); 
aPtr ="This is a test"; 
printf("%s",aPtr); 
} 

आप पॉइंटर सरणी का उपयोग कर सकते हैं। यदि आप एकाधिक स्ट्रिंग को स्टोर करना चाहते हैं। हाँ मुझे पता है कि लूप के लिए उपयोग करना आसान होगा। लेकिन मैं सरल तरीके से व्याख्या करने की कोशिश कर रहा हूं यहां तक ​​कि एक शुरुआत भी समझ सकता है।

int main() 
{ 
char *aPtr[10]; 
aPtr[0] =(char*)malloc(20*sizeof(char)); 
aPtr[0] ="This is a test"; 
aPtr[1] =(char*)malloc(20*sizeof(char)); 
aPtr[1] ="This is a test2"; 
printf("%s\n%s\n",aPtr[0],aPtr[1]); 
} 
+0

आपका पहला उदाहरण मेमोरी लीक करता है, अर्थात् 20 बाइट्स। 'APtr =" करना यह एक परीक्षण है "; 'आप' malloc() 'वापस लौटने के संदर्भ को खो देते हैं। इस स्मृति का कभी भी उपयोग नहीं किया गया था और कार्यक्रम के लाइव समय के दौरान कभी भी इसका उपयोग नहीं किया जाएगा। – alk

+0

'आकार (char) '' 1' निश्चित है। सी में आवश्यक नहीं में 'malloc/calloc/realloc' के नतीजे कास्टिंग न करें और न ही अनुशंसित: http://stackoverflow.com/a/605858/694576 – alk

+0

उत्तर देने वाले सभी लोगों के लिए धन्यवाद, यह एक बहुत मददगार था – user2826534

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