Mam funkcję, która ma dwie liczby całkowite i zwraca ciąg znaków. Teraz mam to:Poprawny sposób zwraca ciąg znaków z funkcji
char* myfunc(int a, int b, int* len)
{
int retLen = ...
char* ret = malloc(retLen + 1);
if (len != NULL)
{
*len = retLen;
}
return ret;
}
Jednak większość funkcji w bibliotece C mają tendencję do zrobienia czegoś więcej tak:
int myfunc(char* ret, int a, int b)
{
...
return retLen;
}
następnie spodziewa się, aby przydzielić pamięć dla funkcji do wypełnienia. To pozwala ci zrobić trochę więcej, jak wybrać, gdzie jest przydzielony ciąg.
W tym przypadku jest kilka matematyki wymaganych w funkcji, aby uzyskać długość i nie ma powodu, aby mieć bufor o dowolnym rozmiarze innym niż potrzebny. Nie ma górnego limitu rozmiaru bufora (i tak nie jest rozsądny).
Co jest uważane za dobrą praktykę podczas zwracania ciągu, którego długość jest dynamicznie znaleziona, biorąc pod uwagę dane wejściowe?
Oczywiście, z tym wzorem, przekazałbyś długość wraz ze wskaźnikiem. Może to być nawet parametr wejściowy/wyjściowy (przekazywany jako 'size_t *'). – cHao
Tak, rzeczywiście, zredagowałem podpis. – clyfe
Bardzo dobra odpowiedź, która bardzo pomaga, więc dziękuję. Kilka pytań: Dlaczego jest to preferowane do funkcji takiej jak 'size_t myfunc (char * output, size_t given, ...)' która skutecznie zwraca 'needed_or_resulted', aby użytkownik mógł ją porównać, aby uzyskać własne znaczenie sukcesu? Dlaczego jest to preferowane dla drugiej funkcji, np. 'MyfuncLength', która wykonuje niezbędne obliczenia długości? – Matt