В C возможно ли освободить только массив первой или последней позиции? - PullRequest
6 голосов
/ 01 июня 2010

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

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;

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

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;

Но тогда у меня будут накладные расходы на копирование всего массива.

Возможно ли освободить только одну позицию массива?

Ответы [ 2 ]

5 голосов
/ 01 июня 2010

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

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

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

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

2 голосов
/ 01 июня 2010

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

...