如何重新分配缩小数组的大小?

时间:2016-11-26 07:29:57

标签: c

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

1 个答案:

答案 0 :(得分:3)

使用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)惯用语,则可以泄漏内存。

通常,'收缩'realloc()将返回原始指针(除非你将它缩小到零大小,当它可能返回NULL)。 “不断增长的”realloc()通常可以改变数据的存储位置。