2016-03-03 114 views
-1

当我有一个函数,得到一个指针int *vector与几个int值。我想删除元素编号n。所以我会在该元素上使用free()。现在的问题是我的int值数组中有一个“洞”。有没有一种简单的方法,我没有这个问题,或者我真的不得不做一个新的int pinter和重新排序我的向量?简单的方法来处理一个数组中的空闲

+5

'vector [n]'是一个'int' ...你不能'释放()'那个。 – FatalError

+0

您可以创建一个结构数组来创建一个假的int数组或链表。 –

+2

'免费()'不会按照您的想法操作或工作 – bolov

回答

1

鉴于这种形式的函数:

void delete_element(int *vector, size_t index) { 
    // ... 
} 

对应于vector实际参数预计是一个指针,指向一系列的一个或多个(暗示:index + 1或更多个)连续int秒。这可能是普通int数组的一部分或全部,也可能是动态分配的数据块。如果前者,那么你根本无法释放任何部分的空间。如果是后者,那么你可以释放或重新分配整个空间,但不只是与一个元素相关的部分。

为了避免删除在数组中留下空洞,您需要将后面的元素向下移动,为此,您需要知道总共有多少个元素。因此,你需要更翔实的函数签名,或许是这样的:

void delete_element(int *vector, size_t *size, size_t index) { 
    // ... 
} 

实际删除可能涉及简单地使用memmove()移动后面的元素(覆盖要删除的一个),然后递减的大小。关于后者,请注意,我建议将指针传递给向量大小,以便该函数可以修改调用者的副本。

如果您还想缩小分配范围,那么您需要做更多的工作(涉及调用realloc(),并将修改后的值vector传回给调用者),但请注意,在这种情况下,您的函数将不起作用在普通阵列上。

0

无法释放()malloc()返回的块的一部分。如果要删除记录[n],则需要将记录[n + 1] ... record [last]复制到数组中。

如果你确实需要释放()每个元素,你必须首先malloc()每个元素。

相关问题