我有这个代码:
int items = 2;
int *array = malloc(items * sizeof(int));
array[0] = 1;
array[1] = 2;
我想弹出第一个项目并从左侧移动分配的内存来执行以下操作:
array[0] == 2
可能需要获取数组的地址并将其移位为 poped_items * sizeof(int)
或类似的内容?第一个 realloc 参数应该是什么?
最佳答案
如果您需要删除左侧的项目(并且仅使用 &array[ItemsToShift]
而不是普通的 array
是不够的),请不要 realloc
,只是memmove
:
memmove(&array[0], &array[1], (items-(&array[1]-array[0]))*sizeof(int));
如果需要,您可以将其设为类型泛型宏:
#define DARRAY_shift(Array, Size, Nshift) \
memmove(&array[0], \
&array[Nshift], \
(Size-(&array[Nshift]-&array[0]))*sizeof(Array[0]) \
);
您可以在memmove
之后进行realloc
:
new_array = realloc(array, (Size-Nshift)*sizeof(array[0]));
但这可能会浪费周期,因为您可以忽略由移位创建的动态数组末尾的间隙。
关于c - 移位分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41061722/