我有一個Python的C擴展模塊,它使用函數_xdr_read_xtc讀取xtc軌跡。用於Python的C擴展中的SIGSEGV
該模塊內置於.so庫中,沒有問題,大部分時間運行良好。但是,有時我會得到'分段錯誤(核心轉儲)'。
static PyObject * _xdr_read_xtc(PyObject *self, PyObject *args)
{
int natoms;
XDRFILE *xd;
xd = (XDRFILE *) malloc(sizeof(XDRFILE));
if (xd == NULL){
return NULL;}
XDRFILE *dummy;
dummy = xd;
if (!PyArg_ParseTuple(args, "ii", &xd, &natoms)){
return NULL;
}
free(dummy);
int step = 0;
float time;
float prec;
matrix box;
rvec *x;
x = malloc(natoms * sizeof(*x));
if (x == NULL){
return NULL;}
// read frame
int status = read_xtc(xd, natoms, &step, &time, box, x, &prec);
if (status == 0 | status == 11){
npy_intp dims[2]= {natoms, 3};
PyArrayObject *matout = (PyArrayObject *) PyArray_SimpleNewFromData(2, dims, NPY_FLOAT, x);
PyArray_ENABLEFLAGS(matout, NPY_ARRAY_OWNDATA);
PyObject *Frame = Py_BuildValue("Oii", matout, status, step);
Py_DECREF(matout);
return Frame;
}
else{
free(x);
return NULL;
}
}
當使用Valgrind進行調試時,我得到'進程以信號11(SIGSEGV)的默認動作終止。訪問不在地址0x195688988映射區域內':
int status = read_xtc(xd, natoms, &step, &time, box, x, &prec);
代碼中是否有任何明顯錯誤?一個無效的指針可能?或者它可能是一個記憶問題?
謝謝!
會[此答案在SO](https://stackoverflow.com/a/42154502/8051589)有幫助嗎?我認爲'xd'(第一個參數)必須是用'xdrfile_open'打開的文件,'natoms'(第二個參數)必須由'read_xtc_natoms'初始化。 –
感謝您的回覆!我已經檢查過這個帖子,並且我傳遞的xd和natoms參數是xdrfile_open和read_xtc_natoms函數的結果 –