c,从头开始缩小分配的空间

时间:2013-07-27 08:33:22

标签: c arrays malloc realloc

假设我已经为

的数组分配了空间
double *array;
array=malloc(100*sizeof(double));

我做了一些流程,最后我不再需要前10个元素,我用realloc尝试了这个:

array=realloc(array+10, 90*sizeof(double));

但是我收到一个无效的指针错误:

*** glibc detected *** ./temp: realloc(): invalid pointer:...

如何从一开始就缩小数组?

2 个答案:

答案 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
  使用malloccallocrealloc指向先前已分配的内存块的指针。   或者,这可以是空指针,在这种情况下,分配新块(就像调用malloc一样)。

不,你不能重新分配这样的元素,realloc需要malloc() / calloc()函数返回的收件人

所以你可以做的是从数组中删除前10个数字,然后调用reallocate。

在许多实现中,通过realloc()进行的收缩动作调用会导致堆中保留大小的更改,并且不会移动内存。 (是的,但内存管理可能会移动到填充碎片区域。)

相关问题