На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Как грамотно организовать массив и работу с памятью?
    Есть программа на языке C, которая состоит из нескольких функций.
    Нужно выделить память под большой массив и загрузить в него данные из файла при помощи одной из функций.
    После этого массив должен быть доступен для других функций и в какой-то момент надо освободить из под него память.

    Как это грамотно организовать? Сделать массив глобальным? Или есть ещё какие-то варианты?
    Сообщение отредактировано: Gene1982 -
      Если массив объявить глобальным, то как потом от него освободить память?
      Есть нормальные стандартные функции для выделения памяти - malloc(), calloc(), free().
      https://prog-cpp.ru/c-alloc/
      Указатель на массив можно сделать глобальным, чтобы массив видели все программные модули.
        Значит надо делать так?

        char *data;

        main()
        {

        data=ReadData();
        ...
        data=FreeData();

        }

        ReadData()
        {
        data=malloc(...
        ...
        }

        FreeData()
        {
        free(data);
        }
          Я не являюсь профессиональным программистом, я инженер и пишу программу для своих задач.
          От профессиональных программистов я слышал, что использовать глобальные переменные - это дурной тон.
          Может быть в моём случае создать локальный указатель и объявить его с ключевым словом static или это не вариани?
            Цитата Gene1982 @
            От профессиональных программистов я слышал, что использовать глобальные переменные - это дурной тон.

            Херня это всё. Дурной тон - это писать запутанныый код.

            И строчку надо подправить на:
            data=(char*)malloc(...
            Т.к. malloc выдваёт указатель на void, а тебе нужен char

            Добавлено
            Цитата
            data=ReadData();
            ...
            data=FreeData();

            Это неправильно.
            Примерно надо так:
            Error = ReadData();
            В самой функции ReadData() написать анализ на ошибку при выделении памяти (NULL) и вывод её в основную ветку main()
            Дальше действовать сообразно результату.
              Цитата DrUnkard @
              И строчку надо подправить на:
              data=(char*)malloc(...
              Т.к. malloc выдваёт указатель на void, а тебе нужен char
              Не надо. Т.к. программа на "голом" C, а в отличие от C++ в нем есть неявное преобразование void* в указатель на любой тип. В C++ из C перешло только неявное преобразование любого указателя в void*.
              Сообщение отредактировано: Dushevny -
                Если такие сложности есть указатель передавать в аргументах
                  С malloc у меня проблем нет. Я просто многое тут упрщённо написал.
                  Главное, что я хотел бы узнать, всё же, насколько уместно использовать глобальные переменные и указатели.
                  Поскольку я не программист, хотелось бы узнать, не будут надо мной смеяться профессиональные программисты, когда увидят в моём коде глобальные перменные?
                  Я инженер-механик, и часто пишу программы на C, они мне очень помогают решать некоторые задачи.
                    Глобальные переменные плохи, когда избыточны. Например, передавать через них параметры в функции не стоит. Но глобальные переменные как таковые имеют вполне конкретное назначение – хранить состояния подсистем. Где их ещё хранить, если в общей области видимости?
                      Можно сделать структуру с данными и её гонять между функциям
                        Сделать массив глобальным можно, но это не самый предпочтительный вариант, так как это может создать проблемы с читаемостью и поддержкой кода. Лучше выделить память динамически при помощи функции malloc() или calloc() и передавать указатель на эту память в функции, которые работают с этим массивом. При необходимости освобождать память можно использовать функцию free().

                        Примерный код:

                        ExpandedWrap disabled
                          #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().
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0294 ]   [ 16 queries used ]   [ Generated: 7.10.24, 07:21 GMT ]