Это правильно в том смысле, что единственный способ, которым функция распределения может вернуть размер распределения, - это вернуть эту информацию. Хотя это не обычное и не привычное.
Обычно вызывающая сторона имеет некоторое представление о том, сколько элементов, вероятно, будет, и распределяет соответственно. Примеры включают scanf (3), массив совпавших выражений в regexe c (3) и буферный массив для readv (2). Эти функции передают размер массива и возвращают заполненное число.
Функции, которые распределяют массивы, встречаются относительно редко. Из тех, что есть в стандартной библиотеке, я не могу вспомнить ту, которая возвращает структуру, подобную вашей. Обычно либо указатель, либо счетчик возвращается по значению, а другой по ссылке. scandir (3), например, выделяет массив символьных указателей. Количество элементов - это возвращаемое значение функции. Расположение массива записывается в указатель, адрес которого передается в качестве аргумента (char ***
).
Другой метод - не вернуть память, а вместо этого обеспечить итерацию и свободные функции. Примеры включают opendir (3) и getpwent (3).
Конечно, стандартная библиотека C была разработана в эпоху, когда функции C не могли возвращать целые структуры. Может быть, они бы выглядели иначе, если бы это было не так. Тем не менее, доминирующая идиома вызывающего абонента выделяет , предполагает, что вы, возможно, захотите тщательно подумать, действительно ли вам нравится ваша функция, как задумано.