如何实现缩小数组的大小



示例:我的数组包含整数{1,2,3,4}我想调整我的数组大小以包含{2,3,4},当我做数组[0]时,它应该给我2.

realloc()缩小数组时,可以在数组末端删除空间,但不能在数组的开头。因此,为了达到所需的结果,您必须复制要保留其新位置的数组的部分,然后调整数组的大小:

/* setup */
int *data = malloc(4 * sizeof(int));  // Error check omitted
for (int i = 0; i < 4; i++)
    data[i] = i + 1;
/* setup complete */
/* Move elements before shrinking array */
memmove(&data[0], &data[1], 3 * sizeof(int));  // Safe move
int *new_data = realloc(data, 3 * sizeof(int));
if (new_data != 0)
    data = new_data;

我不确定"收缩" realloc()是否确实返回NULL(但标准不说不能),因此代码没有机会。许多人会写data = realloc(data, 3 * sizeof(int));并承担风险,他们几乎一直都会摆脱它。请注意,"生长" realloc()确实可以返回null,然后如果您使用old_ptr = realloc(old_ptr, new_size) IDIOM,则可以泄漏内存。

通常,"收缩" realloc()会返回原始指针(除非您将其缩小到零尺寸,否则它可能会返回null)。"生长" realloc()通常可以在存储数据的位置更改。

最新更新