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 выделить массив Xints (я предполагаю, что вы знаете и #defineд х заранее).

int *array = malloc( X * sizeof(int) );

malloc возвращает указатель (переменная, хранящая адрес в памяти) на массив. Если X apriori неизвестно, вы можете прочитать файл, чтобы определить, сколько ints есть и добавить еще int* Аргумент, чтобы сообщить вызывающему абоненту, сколько было прочитано. Вы можете вернуть ptr из функции в persistencia.c, если ясно, что вызывающая сторона несет ответственность за free память. Объявление функции будет выглядеть

int *readInts();

Чтобы передать массив функции в ordena.c, вы должны указать его в качестве аргумента типа int*

void ordena(int *array, size_t length);
Другие вопросы по тегам