Может ли realloc уменьшить мой массив с левой стороны (только C)? - PullRequest
4 голосов
/ 01 октября 2010

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

int *array = (int*) malloc(sizeof(int)*5);
int *array2=NULL;
//Now i want to move my data one step to the left
array=(int*) realloc(array,6);
array2=array+1;
memmove(array,array2,5*sizeof(int));
array=(int*) realloc(array,5);

Это должно работать нормально, но выглядит так расточительно;). Если бы я мог сказать своему компилятору убрать данные с левой стороны сокращающегося массива, мои данные могли бы проскальзывать в памяти, но мне не пришлось бы копировать. Как это:

int *array = (int*) malloc(sizeof(int)*5);
//Now i want to move my data one step to the left
array=(int*) realloc(array,6);
array=(int*) realloc_using_right_part_of_the_array(array,5);

Так что в основном я хочу закончить указателем на array+1, с оставшимся 4 байтом. Я играл с free() и malloc(), но это не сработало ... Я знаю, что realloc также может привести к вызову memcpy, но не каждый раз! Так могло бы быть быстрее, не так ли?

Ответы [ 2 ]

5 голосов
/ 01 октября 2010

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

int *array = (int*) malloc(sizeof(int)*5);
// Fill memory:
// array - {'J', 'o', h', 'n', '\0'}; 
int *array2=NULL;
//Now i want to move my data one step to the left
array=(int*) realloc(array,6);
// array - {'J', 'o', h', 'n', '\0', X};
array2=array+1;
// array2 pointer to 'o of array.
memmove(array,array2,5*sizeof(int));
// This copies the indeterminate x:
// array - {'o', h', 'n', '\0', X, X}
array=(int*) realloc(array,5);
// array - {'o', h', 'n', '\0', X}

X означает неопределенный.

3 голосов
/ 02 октября 2010

Почему бы вам просто не скопировать элементы по одному?

#define NELEMS 5
for (i = 0; i < NELEMS - 1; i++) {
    array[i] = array[i + 1];
}
array[NELEMS - 1] = 0;

или использовать memmove, как вы делали, но без перемещения

#define NELEMS 5
memmove(array, array + 1, (NELEMS - 1) * sizeof *array);
array[NELEMS - 1] = 0;
...