【问题标题】:In C, is it possible do free only an array first or last position?在 C 中,是否可以只释放数组的第一个或最后一个位置?
【发布时间】:2010-06-01 00:30:51
【问题描述】:

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

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;

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

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

【问题讨论】:

    标签: c arrays free malloc position


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-01
        • 1970-01-01
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多