2017-09-04 46 views
1

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

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 
+0

我对这些库并不熟悉,但可能您发现了一个numpy错误。 – Retr0id

回答

1

我相信这是因为你的一个线建设中,numpy的数组对象没有持有对它的引用,所以它被垃圾回收,那么你正在尝试取消引用野指针。我想你的代码,并通过破坏线分成两个避免段错误 - 一个行创建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 

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