2012-03-01 33 views
5

Đây là câu hỏi mới bắt đầu, nhưng xin vui lòng chịu đựng với tôi. Tôi muốn chuyển một char * vào một hàm, và có nó, với nội dung của nhiều chuỗi hiện có. Dưới đây là những gì tôi có (và không hoạt động)Điền thông số đầu ra C

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

Hãy hiển thị mã thực tế của bạn - ví dụ này thậm chí sẽ không biên dịch. –

+0

Cần biên dịch ngay bây giờ, cảm ơn. –

+2

Bạn không thể sử dụng 'strlen (out)'! Đọc những gì 'strlen' làm (hoặc cách chuỗi C hoạt động, cho vấn đề đó). Thay vào đó, bạn cần phải nói 'x * y + x'. Và hoàn toàn chắc chắn rằng mọi 'mảng [i]' đều bị vô hiệu. –

Trả lời

8

A char* chỉ là một con trỏ, chuyển nó trong không cho phép bạn chuyển một cái mới ra ngoài một lần nữa. Bạn cần phải vượt qua một char** như vậy:

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

Sau đó, bạn ăn chức năng nơi nào đó để đưa con trỏ như sau:

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

Điều đó hoạt động tốt. Tại sao không làm việc này: out = (char *) malloc (1000); strcat ((* out), someString); –

+0

@RobertVbr, có thể không hoạt động trong func ban đầu của bạn bởi vì bạn vượt qua trong bộ nhớ uninitialized, strcat có thể không bao giờ tìm thấy một terminator NUL để bắt đầu phụ thêm sau đó. – IanNorton

+0

OK, cảm ơn. –

0

Nó không làm việc vì bạn không bao giờ được phân bổ bộ nhớ cho biến result của bạn - nó chỉ là một con trỏ trỏ đến đâu cả.

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

hoặc

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

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

... 

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

Bạn cũng nên vượt qua trong kích thước của bộ đệm của bạn để chức năng func bạn có thể kiểm tra và xác minh rằng có đủ không gian có sẵn cho đầu ra của nó.

Cả hai giải pháp này giả định rằng bạn phân bổ bộ đệm của mình bên ngoài func. Nếu bạn muốn cấp phát bộ đệm đầu ra bên trong func hơn - như được đề xuất bởi Als - bạn cần chuyển con trỏ tới con trỏ. Trong trường hợp đó, bạn cũng nên trả về kích thước của bộ đệm để người gọi biết có bao nhiêu byte có sẵn trong bộ đệm.