В C это возможно, действительно освобождают только массив первая или последняя позиция?

У меня есть массив, но мне не нужно его первое (или в последний раз) положение. Таким образом, я указываю на новую переменную на остальную часть массива, но я должен освободить массив первая / последняя позиция. Например:

p = read_csv_file();
q = p + 1; // I don't need the first CSV file field
// Here I'd like to free only the first position of p
return q;

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

p = read_csv_file();
q = (int*) malloc(sizeof(int) * (SOME_SIZE - 1));
memcpy(q, p+1, sizeof(int) * (SOME_SIZE - 1));
free(p);
return q;

Но затем у меня будут издержки копирования всего массива.

Действительно ли это возможно, только освобождают единственное положение массива?

6
задан sblundy 1 June 2010 в 00:34
поделиться

2 ответа

Нет. Вы можете только free () полный блок, полученный в результате вызова malloc () (или одного из друзей malloc () ), а не кусок этого блока.

Лучше всего оставить выделенный блок как есть и просто использовать указатель на элемент с индексом один, как если бы он был началом массива (и игнорировать последний элемент).

Использование memcpy работает, если действительно важно для освобождения двух элементов.

Вы также можете сдвинуть все элементы влево на один (т. Е. Переместить элемент с индексом один в индекс ноль и т. Д.), А затем вызвать realloc () , чтобы изменить размер блока и удалить последние два элемента.Однако на самом деле это не очень хорошая идея, потому что наиболее вероятный результат состоит в том, что либо (а) размер базовой кучи фактически не будет изменен, и вы переместите объект и не получите никакой выгоды, либо (б) размер базовой кучи будет изменен, и все будет перемещено во второй раз .

5
ответ дан 17 December 2019 в 00:03
поделиться

Для этого и существует realloc(3) . Для освобождения первого элемента массива я бы предложил пересмотреть алгоритм.

2
ответ дан 17 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

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