假设我已经为
的数组分配了空间double *array;
array=malloc(100*sizeof(double));
我做了一些流程,最后我不再需要前10个元素,我用realloc
尝试了这个:
array=realloc(array+10, 90*sizeof(double));
但是我收到一个无效的指针错误:
*** glibc detected *** ./temp: realloc(): invalid pointer:...
如何从一开始就缩小数组?
答案 0 :(得分:3)
首先,重新分配数组只是为了收缩,这不是一个好主意。如果你这么做很多次,可能会导致内存碎片化。必要时,使用realloc()
扩展数组。 (当然,这不会阻止碎片化,但如果你使用realloc()
更少,那会有所帮助。)
那就是说,如果你还想缩小数组:the documentation(你在问这个问题之前读过的 ,amirite? )说,你必须在realloc()
返回的指针上调用malloc()
。不是指针加十,而不是指针指向欧拉常数,而不是指针减去当月的天数,没有别的,只有那个指针。
所以你必须先移动元素,然后重新分配数组。但这涉及将元素复制到临时缓冲区,如下所示:
double *tmp = malloc(90 * sizeof(*tmp));
memcpy(tmp, array, 90 * sizeof(*tmp));
double *guard = realloc(array, 90 * sizeof(*array));
if (!guard) {
// realloc() failed
abort(); // whatever
}
array = guard;
memcpy(array, tmp, 90 * sizeof(*tmp));
所以这不是更好,你可以在复制其内容并将新获得的指针分配给free()
之后array
旧数组。
答案 1 :(得分:1)
阅读:void* realloc (void* ptr, size_t size);
:
重新分配内存块
更改ptr。
指向的内存块的大小该功能可以将存储块移动到新位置(其位置) 地址由函数返回。
内存块的内容保留到较小的内容 新旧尺寸,即使块移动到新位置。如果 新大小越大,新分配的值就越大 不确定的。
<强>参数:强>
ptr
使用malloc
,calloc
或realloc
指向先前已分配的内存块的指针。 或者,这可以是空指针,在这种情况下,分配新块(就像调用malloc
一样)。
不,你不能重新分配这样的元素,realloc
需要malloc()
/ calloc()
函数返回的收件人
所以你可以做的是从数组中删除前10个数字,然后调用reallocate。
在许多实现中,通过realloc()
进行的收缩动作调用会导致堆中保留大小的更改,并且不会移动内存。 (是的,但内存管理可能会移动到填充碎片区域。)