轻松处理阵列中的免费方式

时间:2016-03-03 21:08:21

标签: c pointers realloc

当我有一个函数获得一个带有int *vectorint个值的指针n时。我想删除元素编号free()。所以我将在该元素上使用import cv2 import numpy as np #load two images srcfilename = 'foo.jpg' src1 = cv2.imread(srcfilename) srcfilename = 'bar.jpg' src2 = cv2.imread(srcfilename) src1_mask = np.zeros(src1.shape[:-1]) #create a polygon for region of interest poly = np.array([ [150,150], [200,100], [350,150], [350,200], [300,220], [200,200], [190,180] ], np.int32) cv2.fillPoly(src1_mask, [poly], 255) 。我现在的问题是我的int值数组中有一个“洞”。有没有一个简单的方法,我没有这个问题,或者我真的需要创建一个新的int pinter并重新排序我的向量?

2 个答案:

答案 0 :(得分: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值传回给调用者),但请注意那种情况下你的函数不适用于普通数组。

答案 1 :(得分:0)

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

如果你真的需要free()每个元素,你必须首先malloc()每个元素。