如何分配或释放数组的部分?

时间:2010-03-19 18:41:15

标签: c arrays

见这个例子:

 int *array = malloc (10 * sizeof(int)) 

然后只释放前3个街区?

或者制作相同的java,使用负索引的数组,或者不以0开头的索引。

非常感谢。

2 个答案:

答案 0 :(得分:17)

你不能直接释放前3个街区。你可以通过重新分配较小的数组来做类似的事情:

/* Shift array entries to the left 3 spaces. Note the use of memmove
 * and not memcpy since the areas overlap.
 */
memmove(array, array + 3, 7);

/* Reallocate memory. realloc will "probably" just shrink the previously
 * allocated memory block, but it's allowed to allocate a new block of
 * memory and free the old one if it so desires.
 */
int *new_array = realloc(array, 7 * sizeof(int));

if (new_array == NULL) {
    perror("realloc");
    exit(1);
}

/* Now array has only 7 items. */
array = new_array;

关于问题的第二部分,您可以递增array,使其指向内存块的中间位置。然后你可以使用负指数:

array += 3;
int first_int = array[-3];

/* When finished remember to decrement and free. */
free(array - 3);

同样的想法也在相反的方向。您可以从array中减去使起始索引大于0.但要小心:正如@David Thornley指出的那样,根据ISO C标准,这在技术上是无效的,并且可能无法在所有平台上运行。

答案 1 :(得分:6)

你无法释放数组的一部分 - 你只能free()malloc()得到的指针,当你这样做时,你将释放你要求的所有分配。

对于负数或非零指数,当您从malloc()取回指针时,可以使用指针执行任何操作。例如:

int *array = malloc(10 * sizeof(int));
array -= 2;

使数组具有有效索引2-11。对于负面指数:

int *array = malloc(10 * sizeof(int));
array += 10;

现在您可以访问此数组,例如array[-1]array[-4]

请确保不要访问阵列外的内存。在C程序和C程序员中,这种有趣的业务通常是不受欢迎的。