Joã*_*los 6 c arrays malloc free position
我有一个数组,但我不需要它的第一个(或最后一个)位置.所以我将一个新变量指向数组的其余部分,但我应该释放数组的第一个/最后一个位置.例如:
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;
Run Code Online (Sandbox Code Playgroud)
否则我要将数组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;
Run Code Online (Sandbox Code Playgroud)
但是我会有复制所有数组的开销.
这可能只释放一个阵列的单个位置吗?
不可以.你只能free()通过电话malloc()(或其中一个malloc()朋友)获得一个完整的区块,而不是该区块的一部分.
您最好的选择可能是将已分配的块保留为原样,只需使用指向索引一元素的指针,就好像它是数组的开头一样(并忽略最后一个元素).
使用memcpy作品,如果真正重要的是释放这两个元素.
您还可以将所有元素向左移动一个(即,将索引1处的元素移动到索引零,依此类推)然后调用realloc()以调整块的大小并删除最后两个元素.但这并不是一个好主意,因为最可能的结果是(a)基础堆分配实际上不会调整大小并且你已经移动了东西并且没有获得任何好处,或者(b)底层堆分配将调整大小,一切都将被第二次移动.