Дефрагментация массива в переполнении стека

Я пытаюсь понять, как это сделать, но не могу обернуться вокруг этого.

У меня есть массив символов, содержащих несколько строк, включая ноль в конце каждой строки.

Как это:

пример

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

Как бы вы это сделали?

-2

Решение

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

0

Другие решения

поместите каждую строку с ‘\ 0’ в массив один за другим, затем используйте другой массив для сохранения индекса каждого ‘\ 0’

0

Я предполагаю, что у вас есть какой-то список, указывающий, где каждая строка начинается и заканчивается:

struct Node {
int startOffset;
int size; // includes trailing zero;
// (not really needed: can search for it with strlength)
};

И вы хотите написать функцию, которая, учитывая vector<Node> вышеупомянутого и массив символов со строками (давайте назовем его chars), перемешивает строки так, что для i-го узла nodes[i].startOffset + nodes[i].size == nodes[i+1].startOffset

Вы можете сделать следующее (предполагается, что 0-й узел находится в startOffset 0, и что вектор узла упорядочен по startOffset):

Node prev = nodes[0];
for (int i = 1; i<nodes.length(); i++) {
Node n = nodes[i];
int targetOffset = prev.startOffset + prev.size;
memmove(chars + targetOffset, chars + n.startOffset, n.size);
n.startOffset = targetOffset;
prev = n;
}
0
По вопросам рекламы [email protected]