示例:我的数组包含整数{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()
通常可以在存储数据的位置更改。