Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 尝试将带有CTYPE的numpy数组转换为C会导致分段错误_Python_C_Numpy_Ctypes - Fatal编程技术网

Python 尝试将带有CTYPE的numpy数组转换为C会导致分段错误

Python 尝试将带有CTYPE的numpy数组转换为C会导致分段错误,python,c,numpy,ctypes,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]*100

所以我的问题是,我试图将图像数据转换为连续数组,以将其传递到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

我相信这是因为在单行构造中,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

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

我不熟悉这些库,但您可能在numpy中发现了一个bug。