Tôi có một hàm được cung cấp hai số nguyên và trả về một chuỗi. Ngay bây giờ tôi có điều này:Cách chính xác trả về một chuỗi từ một hàm
char* myfunc(int a, int b, int* len)
{
int retLen = ...
char* ret = malloc(retLen + 1);
if (len != NULL)
{
*len = retLen;
}
return ret;
}
Tuy nhiên, hầu hết các chức năng trong thư viện C có xu hướng làm điều gì đó giống như:
int myfunc(char* ret, int a, int b)
{
...
return retLen;
}
Sau đó bạn có dự kiến sẽ cấp phát bộ nhớ cho các chức năng để điền vào. Điều này cho phép bạn làm nhiều hơn một chút như chọn nơi chuỗi được phân bổ.
Trong trường hợp này mặc dù có một số toán cần thiết trong hàm để có độ dài và không có lý do để có bộ đệm có kích thước bất kỳ khác với số cần thiết. Không có giới hạn trên về kích thước của bộ đệm (không phải là một trong đó là hợp lý anyway).
Điều gì được coi là thực hành tốt khi trả về chuỗi có độ dài được tìm thấy động cho các yếu tố đầu vào?
Tất nhiên, với mẫu này, bạn sẽ vượt qua độ dài cùng với con trỏ. Nó thậm chí có thể là một tham số đầu vào/đầu ra (được chuyển thành một 'size_t *'). – cHao
Đúng vậy, tôi đã chỉnh sửa chữ ký. – clyfe
Câu trả lời rất hay giúp ích rất nhiều, cảm ơn bạn. Vài câu hỏi: Tại sao điều này lại thích một hàm như 'size_t myfunc (đầu ra char *, size_t được đưa ra, ...)' có hiệu quả trả về 'needed_or_resulted' để người dùng so sánh để có được ý nghĩa riêng của họ để thành công? Ngoài ra, tại sao điều này lại ưu tiên cho hàm thứ hai như 'myfuncLength' có tính toán độ dài cần thiết không? – Matt