6

我有一个数组,但我不需要它的第一个(或最后一个)位置。所以我将一个新变量指向数组的其余部分,但我应该释放数组的第一个/最后一个位置。例如:

p = read_csv_file();
q = p + 1; // I don't need the first CSV file field
// Here I'd like to free only the first position of p
return q;

否则我必须将数组 memcpy 到其他变量,不包括第一个位置,然后释放原始数组。像这样:

p = read_csv_file();
q = (int*) malloc(sizeof(int) * (SOME_SIZE - 1));
memcpy(q, p+1, sizeof(int) * (SOME_SIZE - 1));
free(p);
return q;

但是,我将有复制所有数组的开销。

这是否可以只释放数组的一个位置?

4

2 回答 2

5

不可以。您只能通过调用(或 的一个朋友)free()获得一个完整的块,而不是该块的一部分。malloc()malloc()

您最好的选择可能是保留已分配的块,只使用指向索引 1 处元素的指针,就好像它是数组的开头一样(并忽略最后一个元素)。

如果释放这两个元素 真的那么重要,则使用memcpy有效。

您还可以将所有元素向左移动 1(即,将索引 1 处的元素移动到索引 0,依此类推),然后调用realloc()以调整块的大小并删除最后两个元素。不过,这并不是一个好主意,因为最有可能的结果是(a)底层堆分配实际上不会被调整大小,并且您将四处移动并且没有任何好处,或者(b)底层堆分配将被调整大小,一切都将被第二次移动。

于 2010-06-01T00:37:50.063 回答
2

这就是realloc(3)目的。为了释放第一个数组元素,我建议修改算法。

于 2010-06-01T00:38:49.937 回答