2015-06-28 2 views
2

Say У меня есть следующий код в библиотеке C называется libmylib.so:Невозможно получить доступ значения сопза массива символов

static char mystr[9]; 

/* somewhere else this array is populated with a value 8 bytes or less */ 

const char * 
get_mystr (void) 
{ 
    return mystr; 
} 

От переводчика Python, я называю следующим

from ctypes import * 
mylib = CDLL('libmylib.so') 

для загрузки библиотека. Теперь, я установил переменную, равную mystr

x = mylib.get_mystr() 

Если я пытаюсь проверить значение x или каких-либо его свойства, я получаю ошибку сегментации. Даже используя TAB после ввода x. в приглашении, чтобы узнать, какие поля/функции доступны, приводит к segfault.

Что происходит?

EDIT: Если я сам проверю x, я получаю адрес памяти, как и ожидалось. Если я попытаюсь проверить x.value или посмотреть доступные поля, он сработает.

РЕДАКТИРОВАТЬ 2: Я попытался проверить, было ли объявление static источником моих проблем, но, похоже, оно ведет себя так же без него.

+0

По умолчанию 'restype'' 'c_int'. Как результат функции, это преобразуется в собственное целое Python, которое не будет иметь атрибут 'value'. Установите 'get_mystr.restype = c_char_p', чтобы преобразовать его в строку Python. Это предполагает, что 'mystr' имеет нулевое завершение. – eryksun

+0

Однако это не объясняет segfault, который должен быть вызван ошибкой в ​​другом месте вашей программы. Вам нужно использовать отладчик, например gdb в Linux или cdb в Windows, для печати трассировки стека. – eryksun

+2

Вы говорите: «Где-то в другом месте этот массив заполняется значением 8 байтов или меньше», но (а) вы уверены в этом, и (b) правильно ли он заканчивается нулем? Если он не заканчивается на нуль, кто-то собирается бежать до бесконечности (или, по крайней мере, задолго до конца массива 'mystr'), ища' '\ 0''. –

ответ

1

@eryksun указал, что restype функции C по умолчанию имеет значение int и разрешается целое число Python.

При вызове mylib.get_mystr.restype = c_char_p он теперь правильно разрешает объект bytes, который может быть декодирован должным образом.

+0

Вы также можете принять свой собственный ответ. – alk

+0

@alk На самом деле, я должен ждать 2 дня после отправки моего собственного ответа, чтобы принять его. Спросите на мета, если вы не знаете, почему это так. – 2mac

Смежные вопросы