2011-10-18 11 views
6

मैं एकल अक्षर तारों की एक छोटी सरणी/तालिका को मॉलोक करने और मुक्त करने की कोशिश कर रहा हूं। मुझे पता है कि यह एक सरणी में किया जा सकता है, लेकिन मैं इसे एक मॉलोक और मुफ्त के साथ करने की कोशिश करना चाहता हूं।चार ** टेबल malloc कैसे करें?

char **letters = (char**) malloc(5 * sizeof(char*)); 
int i =0; 
for(i=0; i < NUMLETTERS ; ++i) 
{ 
    letters[i] = (char*) malloc(2*sizeof(char)); //2 is for the letter and null terminator 
} 

letters[0] = "a"; 
letters[1] = "b"; 
letters[2] = "c"; 
letters[3] = "d"; 
letters[4] = "e"; 

//Do stuff here 

int i =0; 
for(i=0; i < 5; ++i) 
{ 
    free(letters[i]); 
} 


free(letters); 

उपरोक्त कोड ठीक संकलित करता है तथा यह भी बीच में मेरे कोड काम करता है और ठीक चलाता है, लेकिन क्रम में यह मुफ़्त भागों के दौरान कोई त्रुटि हो जाता है:

मैं अब इस अधिकार है। इसके अलावा, valgrind..it का उपयोग करने के बाद कहते हैं कि मुफ्त (अक्षर [i]); अमान्य है।

कोई मदद?

उत्तर

5

समस्या यहाँ है:

letters[0] = "a"; 
letters[1] = "b"; 
letters[2] = "c"; 
letters[3] = "d"; 
letters[4] = "e"; 

आप स्ट्रिंग शाब्दिक के साथ अपने malloc'ed संकेत से प्रत्येक अधिलेखित कर रहे हैं। फिर आप उन्हें अंतिम पाश में मुक्त करते हैं। चूंकि आप प्रभावी रूप से स्ट्रिंग अक्षर को मुक्त कर रहे हैं, यह विफल रहता है।

1:

वहाँ दो इस को हल करने के तरीके हैं अगर आप सिर्फ उन्हें स्ट्रिंग शाब्दिक बताए जाते हैं आप आंतरिक आवंटन की जरूरत नहीं है। तो दोनों loops से छुटकारा पाएं।

2: strcpy प्रत्येक स्ट्रिंग अक्षर के बजाय।

+0

आह! मुझे कुछ ऐसा करना चाहिए: स्ट्रैपी (अक्षरों [0], "ए"); सही? – Flipper

+0

सही, यह काम करेगा। – Mysticial

3

आप सरणी में प्रत्येक स्ट्रिंग के लिए स्मृति को सही ढंग से आवंटित कर रहे हैं, लेकिन फिर आप उस स्मृति का उपयोग नहीं कर रहे हैं। आप स्ट्रिंग अक्षर "ए", "बी", "सी" इत्यादि को इंगित करने के लिए पांच सरणी तत्वों में से प्रत्येक में char* पॉइंटर्स को बदल रहे हैं।

तो, आपने मूल स्मृति के संदर्भ खो दिए हैं आवंटित, और आप इसके बजाय स्मृति मुक्त करने की कोशिश कर रहे हैं जो आपके नहीं है।

इस प्रकार की स्ट्रिंग संकेत देने की

:

letters[0] = "a"; 

आप स्मृति में स्ट्रिंग को कॉपी किया जाना चाहिए अगर आप इस तरह, आवंटित किया है:

strncpy(letters[0], "a", 2); 
+0

'0 0' को शामिल करने के लिए आकार तर्क 2 होना चाहिए। मेरा बिंदु साबित करने के लिए यहां एक परीक्षण स्निपेट है: 'int main (int argc, char ** argv) { char * str1 =" a "; चार str2 [2]; str2 [1] = 0xFF; strncpy (str2, str1, 1); printf ("str2 [0] =% x, str2 [1] =% x \ n", str2 [0] और 0xFF, str2 [1] और 0xFF); } ' –

+0

अब फिक्स्ड, धन्यवाद। –

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