Можно ли увеличить размер статически размещенного массива?

Я знаю, что возможно увеличить размер динамически размещаемого массива.

Но можно ли увеличить размер статически размещенного массива? Если да, то как?

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

5 ответов

Решение

Простой ответ - нет, этого нельзя сделать. Отсюда и название "статичный".

Сейчас многие языки имеют вещи, которые выглядят как статически размещенные массивы, но на самом деле статически размещаются ссылки на динамически размещаемый массив. Те, которые вы могли бы изменить размер.

В VB .NET это будет:

Redim Preserve ArrayName(NewSize)

хотя я не уверен, какой язык вам нужен...

И я бы не стал часто использовать эту команду... она ужасно неэффективна. Связанные списки и растущие структуры данных намного эффективнее.

Нет. Здесь есть два варианта:

  1. Используйте динамический
  2. Или, рискуя потратить память, если у вас есть представление о максимальном количестве элементов, которые будет хранить массив, статически распределите их соответствующим образом.

Да, это был С.

Нет. Статическое распределение дает компилятору разрешение делать всевозможные предположения, которые затем включаются в программу во время компиляции.

Среди этих предположений:

  1. безопасно размещать другие данные сразу после массива (не оставляя места для роста), и
  2. массив начинается с определенного адреса, который затем становится частью машинного кода программы; Вы не можете разместить новый массив где-то (и использовать его), потому что ссылки на адрес не могут быть обновлены.

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

Если вы осторожны, вы можете использовать alloca(), Массив размещается в стеке, но с точки зрения стиля кода это очень похоже на использование malloc (вам не нужно free это, хотя, это делается автоматически). Я позволю вам решить, называть ли это "статическим" массивом.

Технически в C невозможно даже увеличить размер динамически выделяемого массива.

По факту, realloc()выполняет какую-то процедуру "создать новый объект и скопировать данные". Он вообще не изменяет размер существующего объекта кучи-памяти.

Итак, ответ прост: вы не можете изменить размер любого объекта или массива объектов после того, как он был выделен, ни динамически, ни статически.

Что вы можете сделать, так это использовать ту же стратегию, разработав функцию, которая создает другой статический выделенный массив объектов желаемого размера и копирует данные. Если новый массив объектов меньше старого, значения внутри разницы отбрасываются.

Единственное отличие состоит в том, что размер нового массива, эквивалентный размеру старого массива, необходимо зафиксировать во время компиляции.

Другие вопросы по тегам