示例:我的数组包含整数{1,2,3,4} 我想调整我的数组大小以包含{2,3,4},当我做数组[0]它应该给我2.
答案 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()
通常可以改变数据的存储位置。