Когда я должен использовать статическое распределение памяти и когда я должен использовать динамическое распределение памяти? - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть функция, которая создает массив.Этот массив я хочу вернуть.Первоначально я выделил пространство для массива с помощью malloc, но теперь я начинаю понимать, что использование динамического выделения памяти кажется ненужным, поскольку я мог просто вернуть копию массива.Когда я должен использовать динамическое распределение (malloc) и когда я должен просто придерживаться статического?

* int createArray(some parameter, some parameter) {
int n = 0;
while(.....) {
n++;

}

* int newArray = (*int) malloc (sizeof(int) * n);

return newArray;

}

someArray = createArray(parameter, parameter);

РЕДАКТИРОВАТЬ: Например, будет ли этот измененный код допустимой альтернативой коду выше?Будет ли он работать как задумано и вернуть массив, который я могу назначить и использовать позже в программе?

* int createArray(some parameter, some parameter) {
    int n = 0;
    while(.....) {
    n++;

    }

    int newArray[n];

    return newArray;

    }

    someArray = createArray(parameter, parameter);

Я новичок в области компьютерных наук, заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Вы никогда не должны использовать static по причинам, которые вы приводите.Рассмотрим этот код:

someArray = createArray(parameter, parameter);
someArray2 = createArray(parameter, parameter);

Если вы используете static, то оба они будут указывать на одну и ту же память, что, вероятно, не то, что вы хотите.Это допустимый код на C, но большинство кодировщиков настоятельно рекомендуют это сделать.Кроме того, имя функции начинается с create , что является очень убедительным признаком того, что вам следует использовать динамическое распределение.

В общем случае static подходит, когда вам нужно сохранить данныев функции.Никогда не возвращайте указатель на статические переменные.Это может привести к отслеживаемым ошибкам.

Очень простой пример того, где статические переменные могут быть полезны, - простой счетчик.

int count() {
    static int c = 0;
    c++;
    return c;
}

Более сложный пример - генератор случайных чисел, где вынужно сохранить предыдущий номер.Вы можете найти пример здесь.

0 голосов
/ 18 февраля 2019

У меня есть догадка, что OP хотел запросить автоматическое распределение вместо статического выделения, так как ключевое слово static не используется в примере кода.Этот ответ написан с этой точки зрения.

Если ваша функция возвращает массив, вы хотите использовать динамическое распределение памяти.Если вы используете автоматическое выделение памяти, ваш массив перестанет существовать после того, как функция, которая была объявлена ​​в выходах.Неофициально вы все еще можете иметь к нему доступ , но что касается языка Си, то честная игра будет перезаписана и не будет надежной или безопасной.

Как правило, вы будетехотите использовать автоматическое выделение памяти везде, где это возможно, потому что это самоуправление (вы не можете забыть освободить его позже и вызвать утечку памяти).Некоторые исключения из этого правила:

  • Память должна пережить функцию создания
  • Неизвестно, сколько памяти потребуется во время компиляции
  • Когда вынужна тонна памяти (больше, чем может обеспечить стек)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...