2012-03-01 19 views
5

यह एक शुरुआती प्रश्न है, लेकिन कृपया मेरे साथ भालू। मैं एक समारोह में एक char * में गुजरना चाहता हूं, और इसे कई मौजूदा तारों की सामग्री के साथ पॉप्युलेट किया है। यहाँ मैं क्या है है (और काम नहीं करता है)सी आउटपुट पैरामीटर पॉप्युलेट

int func(char *out) { 
    int i; 
    int x = 10; 
    int y = 10; 
    char array[x][y]; 

    out = malloc(x * y + x); 
    memset(out, 0x00, strlen(out)); 
    for (i=0; i<x; i++) { 
      strcat(out, array[i]); 
      strcat(out, "\n"); 
    } 
} 

//main 
    char *result; 
    func(result); 
+1

कृपया अपने वास्तविक कोड दिखाने - इस उदाहरण भी संकलन नहीं होंगे। –

+0

अब संकलित करना चाहिए, धन्यवाद। –

+2

आप 'strlen (out)' का उपयोग नहीं कर सकते! पढ़ें 'स्ट्रेलन' क्या करता है (या उस मामले के लिए सी स्ट्रिंग कैसे काम करते हैं)। आपको इसके बजाय 'x * y + x' कहना होगा। और बिल्कुल सुनिश्चित करें कि प्रत्येक 'सरणी [i] 'शून्य समाप्त हो गई है। –

उत्तर

8

char* सिर्फ एक पॉइंटर है, इसे पास करने से आपको एक नया बार फिर से पास नहीं करने देता है। आप एक char** इसलिए की तरह पारित करने के लिए की जरूरत है:

void get_name(char** ppname){ 
    char * pname = strdup("my name is fred"); 
    *ppname = pname; 
} 

फिर आप समारोह को खिलाने के कहीं तो जैसे सूचक डाल करने के लिए:

char * name; 
get_name(&name); 
printf("got '%s'\n", name); 
free(name); 
+0

यह ठीक काम करता है। यह क्यों काम नहीं करता है: बाहर = (char *) malloc (1000); स्ट्रैट ((* आउट), कुछ स्ट्रिंग); –

+0

@RobertVbr, जो शायद आपके मूल func में काम नहीं करता है क्योंकि आप अनियमित स्मृति में गुजरते हैं, स्ट्रैट को कभी भी एनयूएल टर्मिनेटर को बाद में शुरू करने के लिए नहीं मिल सकता है। – IanNorton

+0

समझ गया, धन्यवाद। –

0

यह है क्योंकि आप अपने result चर के लिए स्मृति आवंटित कभी नहीं काम नहीं करता है - यह सिर्फ एक सूचक है कि कहीं की ओर इशारा करता है।

char result[1000]; // change size as needed if you know the size ahead of time 
func(result); 

या

char *pResult = malloc (1000); // allocate dynamically 

if (pResult != NULL) 
    func (pResult); 

... 

if (pResult != NULL) 
    free (pResult); 

आप भी अपने बफर के आकार में पारित तो अपने func समारोह जाँच करें और पुष्टि वहाँ इसके उत्पादन के लिए पर्याप्त स्थान उपलब्ध है कि कर सकते हैं चाहिए।

इन दोनों समाधानों का मानना ​​है कि आप अपने बफर को func के बाहर आवंटित करते हैं। यदि आप func के अंदर आउटपुट बफर आवंटित करना चाहते हैं - जैसा कि Als द्वारा सुझाया गया है - आपको पॉइंटर-टू-पॉइंटर पास करने की आवश्यकता है। उस स्थिति में, आपको बफर के आकार को भी वापस करना चाहिए ताकि कॉलर जानता है कि बफर में कितने बाइट उपलब्ध हैं।

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