Может ли Realloc сокращать свой массив на левой стороне (только C)?

StackOverflow https://stackoverflow.com/questions/3841955

  •  27-09-2019
  •  | 
  •  

Вопрос

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

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, но не каждый раз! Так что это может быть быстрее, не так ли это?

Это было полезно?

Решение

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

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}

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

Другие советы

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

#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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top