Segfault с ctypes при возврате структуры - 32-разрядная версия Linux - PullRequest
4 голосов
/ 29 ноября 2011

, поэтому я получаю segfault от ctypes на 32-битной машине linux, которую не могу воспроизвести на 64-битной darwin или linux.

Вот C:

typedef struct {
  void *ptr;
  } doodle;

doodle C_intpointerfunction(int *a)
{
  *a = 41;
  doodle foo;
  foo.ptr = a;
  return foo;
}

который скомпилирован с:

gcc -c intpointerlibrary.c
gcc -shared intpointerlibrary.o -o libintpointerlib.so

и вот Python:

import numpy as N
from ctypes import *

_libintpointer = N.ctypeslib.load_library('libintpointerlib.so','.')

_libintpointer.C_intpointerfunction.restype = c_void_p
_libintpointer.C_intpointerfunction.argtypes = [POINTER(c_int)]
def P_intpointerfunction():
  lrc = c_int(0)
  print "lrc before (should be 0) = "+str(lrc.value)
  return_val = _libintpointer.C_intpointerfunction(byref(lrc))
  print "lrc after (should be 41) = "+str(lrc.value)
  return return_val

так что теперь, когда я вызываю эту функцию:

  rc = P_intpointerfunction()

я получаювыдаёт ошибку сегментации.Я попытался создать класс Python, чтобы обернуть возвращенную структуру, созданную на стороне C, с теми же результатами.Если возвращать нативный тип ctypes (например, c_int), все работает нормально .. Это действительно просто проблема с 32-битным Linux, или я что-то не учел?Спасибо!

1 Ответ

5 голосов
/ 29 ноября 2011

Не уверен, почему вы устанавливаете restype = c_void_p;

class DOODLE(Structure):
    _fields_ = [('ptr', c_void_p)]
_libintpointer.C_intpointerfunction.restype = DOODLE

работает для меня, как ожидалось, в Linux x86-64.

...