나는 다음과 같은 코드 보았을 때 나는 파이썬을위한 C 확장을 배울려고하기 때문에이 파일 methodobject.c을 읽고 있었다 :파이썬 C 코드에서 C 코드가 ptr을 반환하여 변수를 스택에 넣습니다. 내가 뭘 놓치고 있니?
PyObject *
PyCFunction_Call(PyObject *func, PyObject *arg, PyObject *kw)
{
PyCFunctionObject* f = (PyCFunctionObject*)func;
PyCFunction meth = PyCFunction_GET_FUNCTION(func);
PyObject *self = PyCFunction_GET_SELF(func);
Py_ssize_t size;
switch (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST)) {
case METH_VARARGS:
if (kw == NULL || PyDict_Size(kw) == 0)
return (*meth)(self, arg);
break;
을 더 내가
return (*meth)(self, arg);
보고
더 깨달을수록 나는 그것을 이해하지 못한다. I 생각해 보면은 self (로컬로 선언 된 포인터)와 arg (외부로 PyCFunctionCall로 전달 된 포인터)를 취하는 함수 인 meth에 대한 포인터를 반환한다고 생각합니다. 그러나 마치 meth & 자기가 스택에 할당 된 것처럼 보이기 때문에 PyCFunctionCall이 종료되면 해제되고 전달 된 변수에 문제가 발생합니다.
무엇이 여기에 있습니까?
아 !!! 고맙습니다. 나는 멍청이처럼 느껴지지만 적어도 나는 깨달은 사람이다. – user1245262
그래서 우리가 여기에 있습니다. @ams 메모처럼 너무 나쁘지는 않습니다. 함수 포인터 구문이 혼란 스러울 수 있습니다. – JoeFish