Logan Ракаи имеет хороший ответ, тем не менее, Я хочу предложить другой подход, так как мой опыт показывает, что лучше не, чтобы вернуть динамическую выделенную память, когда это возможно (а иногда и нет).
Более гибкий дизайн должен был бы написать функцию, которая принимает указатель и размер массива.
Кроме того, при написании долгосрочных проектов, которые необходимо поддерживать (возможно, не только от вас самих, но и от других программ), полезно сохранять «проблемы» вместе.
Хорошим примером является то, что когда управление памятью (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
на ошибки более распространено, чем можно было бы верить.
Зачем объявлять глобальный массив? Когда вы передаете массив функции, он ухудшается до указателя ... что делает его очень простым. Для массива 'int' вы можете попробовать' void func (int * array, size_t length) '... чем, просто отредактируйте массив на месте. – Myst
C не имеет класса – user3629249