Как изменить размер массива во время работы программы в C [duplicate]

без преобразования строки в массив;

String.prototype.reverse = function() {

    var ret = "";
    var size = 0;

    for (var i = this.length - 1; -1 < i; i -= size) {

        if (
          '\uD800' <= this[i - 1] && this[i - 1] <= '\uDBFF' && 
          '\uDC00' <= this[i]     && this[i]     <= '\uDFFF'
        ) {
            size = 2;
            ret += this[i - 1] + this[i];
        } else {
            size = 1;
            ret += this[i];
        }
    }

    return ret;
}

console.log('anãnam anañam' === 'mañana mañana'.reverse());

с использованием Array.reverse без преобразования символов в кодовые точки;

String.prototype.reverse = function() {

    var array = this.split("").reverse();

    for (var i = 0; i < this.length; ++i) {

        if (
          '\uD800' <= this[i - 1] && this[i - 1] <= '\uDBFF' && 
          '\uDC00' <= this[i]     && this[i]     <= '\uDFFF'
        ) {
            array[i - 1] = array[i - 1] + array[i];
            array[i] = array[i - 1].substr(0, 1);
            array[i - 1] = array[i - 1].substr(1, 1);
        }

    }

    return array.join("");
}

console.log('anãnam anañam' === 'mañana mañana'.reverse());
10
задан Aaron de Windt 30 September 2010 в 06:04
поделиться

4 ответа

Вы не можете. Обычно это выполняется с динамическим распределением памяти.

// Like "ENEMY enemies[100]", but from the heap
ENEMY* enemies = malloc(100 * sizeof(ENEMY));
if (!enemies) { error handling }

// You can index pointers just like arrays.
enemies[0] = CreateEnemy();

// Make the array bigger
ENEMY* more_enemies = realloc(enemies, 200 * sizeof(ENEMY));
if (!more_enemies) { error handling }
enemies = more_enemies;

// Clean up when you're done.
free(enemies);
20
ответ дан Bodo Thiesen 19 August 2018 в 19:57
поделиться
  • 1
    x = realloc(x, ...) - это утечка памяти, ожидающая своего появления. (Тем не менее, я понимаю, что демонстрация того, как справляться с динамическими неудачами распределения, не была точкой этого ответа.) – bk1e 30 September 2010 в 16:40
  • 2
    Правда, и я должен был проверить, возвращает ли malloc NULL. – dan04 30 September 2010 в 17:08
  • 3
    Ответ отредактирован (в ожидании экспертной оценки) для правильной проверки ошибок, поскольку он используется в качестве цели для дублирования и как ~ 24k просмотров. – Bodo Thiesen 29 November 2016 в 23:44

Взгляните на realloc, который позволит вам изменить размер памяти, на которую указывает данный указатель (который в массивах C является указателем).

0
ответ дан dj2 19 August 2018 в 19:57
поделиться
  • 1
    Я считаю, что для этого массив должен быть массивом, выделенным malloc, а не в стеке. Также следует предупредить, что если он не сможет выделить на месте, он освободит старый блок и выделит новый блок. Это аннулирует любые указатели в исходном блоке. – Michael Anderson 30 September 2010 в 06:14
  • 2
    Ах, да. Оба эти должны быть приняты во внимание, если вы собираетесь использовать realloc. – dj2 30 September 2010 в 22:17
  • 3
    Массивы не являются указателями. Массивы распадаются на указатели при передаче функции. Массив и указатель - это две разные вещи. – Robbie 15 August 2017 в 19:42

Как предложил NickTFried, Linked List - один из способов. Другой - иметь таблицу, достаточно большую, чтобы удерживать максимальное количество элементов, которые вы когда-либо имели, и управлять ими (какие из них действительны или нет, сколько противников в настоящее время в списке).

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

Если производительность - это проблема (и я предполагаю, что это так), правильно распределенная таблица - это то, что я буду использовать.

0
ответ дан Matthieu 19 August 2018 в 19:57
поделиться
  • 1
    Это все-таки реализация массива списка. Вы правы, но для этого требуется знание максимального размера массива. – user 30 September 2010 в 06:17

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

3
ответ дан user 19 August 2018 в 19:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: