当我有一个函数获得一个带有int *vector
个int
个值的指针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并重新排序我的向量?
答案 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()每个元素。