C - Возвращение массива из функции
У меня вопрос, у меня есть проект C, который имеет файлы.c:
trab.c
ordena.c
persistencia.c
persistencia.c
Где мне нужно прочитать X целых чисел из файла.txt
trab.c
имеет основное. Куда я должен позвонить persistencia.c
получить массив целых чисел X (определяемых параметром в главном) и вызвать функции сортировки из ordena.c
передавая указанный массив как param.
Мой вопрос Какой менее простой способ сделать это? Могу ли я объявить глобальный массив вместо прохождения через параметры? Могу ли я использовать malloc для доступа к var из другого класса?
2 ответа
У Логана Ракаи хороший ответ, однако я хотел бы предложить другой подход, поскольку мой опыт показывает, что лучше не возвращать динамически выделенную память, когда это возможно (а иногда и нет).
Более гибкий дизайн - написать функцию, которая принимает указатель и размер массива.
Кроме того, когда вы пишете долгосрочные проекты, которые необходимо поддерживать (возможно, не только вами, но и другими программами), полезно держать "проблемы" вместе.
Хорошим примером является то, что, когда управление памятью (free
) выполняется вызывающей функцией, лучше, если выделение памяти (malloc
) выполняется в одной и той же вызывающей функции... При разделении задачи управления памятью между различными функциями более вероятно, что будущие сопровождающие будут вносить утечки памяти в код.
В этом случае довольно просто выделить массив, используя стек или malloc
и передать его.
т. е. вот быстрый (несколько бесполезный) пример перемещения задачи управления памятью в вызывающую функцию (main
). Обратите внимание, что это позволяет вам использовать как динамическое выделение памяти, так и выделение стека при вызове функций, связанных с массивом.
size_t get_array_size(void /* or any parameters */) {
/* do whatever you need */
return 10; /*for our example */
}
void fill_array(int *arry, size_t size) {
while (size) {
size--;
arry[size] = 1; /* fill in data here */
}
}
int use_array(int *arry, size_t size) {
fprintf(stderr, "***\n");
while (size) {
size--;
arry[size] -= 1; /* do whatever */
fprintf(stderr, "array[%lu] == %d\n", size, arry[size]);
}
return 0; /* or return -1 for error */
}
int main(int argc, char const *argv[]) {
int array1[20];
int *array2;
size_t array2_size = get_array_size();
array2 = malloc(sizeof(*array2) * array2_size);
fill_array(array1, 20);
fill_array(array2, array2_size);
if (use_array(array1, 20))
perror("WTF?! "), exit(0);
if (use_array(array2, array2_size))
perror("WTF?! "), exit(0);
return 0;
}
Это мои 2¢. Возможно, мой код управления ошибками несколько извращен, но возвращает -1
на ошибки чаще, чем можно было бы поверить.
Ты можешь использовать malloc
выделить массив X
int
s (я предполагаю, что вы знаете и #define
д х заранее).
int *array = malloc( X * sizeof(int) );
malloc
возвращает указатель (переменная, хранящая адрес в памяти) на массив. Если X
apriori неизвестно, вы можете прочитать файл, чтобы определить, сколько int
s есть и добавить еще int*
Аргумент, чтобы сообщить вызывающему абоненту, сколько было прочитано. Вы можете вернуть ptr из функции в persistencia.c, если ясно, что вызывающая сторона несет ответственность за free
память. Объявление функции будет выглядеть
int *readInts();
Чтобы передать массив функции в ordena.c, вы должны указать его в качестве аргумента типа int*
void ordena(int *array, size_t length);