尝试将带有ctypes的numpy数组转换为C会产生Segmentation错误

时间:2017-09-04 12:32:55

标签: python c numpy ctypes

所以我的问题是我试图将图像数据转换为连续数组以将其传递给C库,但由于某种原因numpy在太长的数组上给出了分段错误。看一下例子

data =  np.ascontiguousarray(np.array([1]*10000, dtype=np.float32)/255).ctypes.data_as(POINTER(c_float))
print data.contents.value # ok

data =  np.ascontiguousarray(np.array([1]*1000000, dtype=np.float32)/255).ctypes.data_as(POINTER(c_float))
print data.contents.value #giving segmentation fault

1 个答案:

答案 0 :(得分:1)

我相信这是因为你的单行构造,numpy数组对象没有持有它的引用,所以它被垃圾收集,然后你试图取消引用一个悬空指针。我尝试了你的代码,并通过将行分成两行来避免segfault,一行创建numpy数组,然后第二行获取指向底层存储的指针:

x = np.ascontiguousarray(np.array([1]*10000000, dtype=np.float32)/255)
data = x.ctypes.data_as(POINTER(c_float))
print data.contents.value # no more segmentation fault

我猜更大的内存块被更积极地收集,因此行为的差异取决于大小。我还必须增加内存大小才能在我的机器上获得段错误。