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
источником моих проблем, но, похоже, оно ведет себя так же без него.
По умолчанию 'restype'' 'c_int'. Как результат функции, это преобразуется в собственное целое Python, которое не будет иметь атрибут 'value'. Установите 'get_mystr.restype = c_char_p', чтобы преобразовать его в строку Python. Это предполагает, что 'mystr' имеет нулевое завершение. – eryksun
Однако это не объясняет segfault, который должен быть вызван ошибкой в другом месте вашей программы. Вам нужно использовать отладчик, например gdb в Linux или cdb в Windows, для печати трассировки стека. – eryksun
Вы говорите: «Где-то в другом месте этот массив заполняется значением 8 байтов или меньше», но (а) вы уверены в этом, и (b) правильно ли он заканчивается нулем? Если он не заканчивается на нуль, кто-то собирается бежать до бесконечности (или, по крайней мере, задолго до конца массива 'mystr'), ища' '\ 0''. –