Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[35.173.48.18] |
|
Сообщ.
#1
,
|
|
|
Есть программа на языке C, которая состоит из нескольких функций.
Нужно выделить память под большой массив и загрузить в него данные из файла при помощи одной из функций. После этого массив должен быть доступен для других функций и в какой-то момент надо освободить из под него память. Как это грамотно организовать? Сделать массив глобальным? Или есть ещё какие-то варианты? |
Сообщ.
#2
,
|
|
|
Если массив объявить глобальным, то как потом от него освободить память?
Есть нормальные стандартные функции для выделения памяти - malloc(), calloc(), free(). https://prog-cpp.ru/c-alloc/ Указатель на массив можно сделать глобальным, чтобы массив видели все программные модули. |
Сообщ.
#3
,
|
|
|
Значит надо делать так?
char *data; main() { data=ReadData(); ... data=FreeData(); } ReadData() { data=malloc(... ... } FreeData() { free(data); } |
Сообщ.
#4
,
|
|
|
Я не являюсь профессиональным программистом, я инженер и пишу программу для своих задач.
От профессиональных программистов я слышал, что использовать глобальные переменные - это дурной тон. Может быть в моём случае создать локальный указатель и объявить его с ключевым словом static или это не вариани? |
Сообщ.
#5
,
|
|
|
Цитата Gene1982 @ От профессиональных программистов я слышал, что использовать глобальные переменные - это дурной тон. Херня это всё. Дурной тон - это писать запутанныый код. И строчку надо подправить на: data=(char*)malloc(... Т.к. malloc выдваёт указатель на void, а тебе нужен char Добавлено Цитата data=ReadData(); ... data=FreeData(); Это неправильно. Примерно надо так: Error = ReadData(); В самой функции ReadData() написать анализ на ошибку при выделении памяти (NULL) и вывод её в основную ветку main() Дальше действовать сообразно результату. |
Сообщ.
#6
,
|
|
|
Цитата DrUnkard @ Не надо. Т.к. программа на "голом" C, а в отличие от C++ в нем есть неявное преобразование void* в указатель на любой тип. В C++ из C перешло только неявное преобразование любого указателя в void*. И строчку надо подправить на: data=(char*)malloc(... Т.к. malloc выдваёт указатель на void, а тебе нужен char |
Сообщ.
#7
,
|
|
|
Если такие сложности есть указатель передавать в аргументах
|
Сообщ.
#8
,
|
|
|
С malloc у меня проблем нет. Я просто многое тут упрщённо написал.
Главное, что я хотел бы узнать, всё же, насколько уместно использовать глобальные переменные и указатели. Поскольку я не программист, хотелось бы узнать, не будут надо мной смеяться профессиональные программисты, когда увидят в моём коде глобальные перменные? Я инженер-механик, и часто пишу программы на C, они мне очень помогают решать некоторые задачи. |
Сообщ.
#9
,
|
|
|
Глобальные переменные плохи, когда избыточны. Например, передавать через них параметры в функции не стоит. Но глобальные переменные как таковые имеют вполне конкретное назначение – хранить состояния подсистем. Где их ещё хранить, если в общей области видимости?
|
Сообщ.
#10
,
|
|
|
Можно сделать структуру с данными и её гонять между функциям
|
Сообщ.
#11
,
|
|
|
Сделать массив глобальным можно, но это не самый предпочтительный вариант, так как это может создать проблемы с читаемостью и поддержкой кода. Лучше выделить память динамически при помощи функции malloc() или calloc() и передавать указатель на эту память в функции, которые работают с этим массивом. При необходимости освобождать память можно использовать функцию free().
Примерный код: #include <stdlib.h> void load_data(int* array, int size) { // загрузка данных в массив } void process_data(int* array, int size) { // обработка данных в массиве } int main() { int size = 1000000; int* array = (int*)malloc(sizeof(int) * size); // выделение памяти load_data(array, size); // загрузка данных process_data(array, size); // обработка данных free(array); // освобождение памяти return 0; } Здесь мы выделили память под массив размером size при помощи функции malloc(), передали указатель на эту память в функции load_data() и process_data(), а затем освободили эту память при помощи функции free(). |