Хотя я не знаком с libfprint , взглянув на ваш код и сравнив его с документацией, я вижу две проблемы с вашим кодом, которые обе могут вызвать ошибку сегментации:
Первая проблема:
Согласно документации функции fp_discover_devs
, NULL
возвращается при ошибке. В случае успеха возвращается список с завершающим NULL, который может быть пустым.
В следующем коде вы проверяете сбой / успех, но не проверяете пустой список:
devices=fp_discover_devs();
if(devices){
device=fp_dev_open(*devices);
fp_dscv_devs_free(devices);
}
Если devices
не равно NULL, но пусто, то devices[0]
(что эквивалентно *devices
) равно NULL. В этом случае вы передаете этот NULL-указатель на fp_dev_open
. Это может вызвать ошибку сегментации.
Я не думаю, что это причина вашей ошибки сегментации, потому что эта ошибка в вашем коде сработает только в том случае, если будет возвращен пустой список.
Вторая проблема:
Последний параметр fp_dev_img_capture
должен быть указателем на выделенную переменную типа struct fp_img *
. Это сообщает функции адрес переменной, в которую она должна писать. Однако с кодом
struct fp_img **img;
[...]
caps=fp_dev_img_capture(device,0,img);
вы передаете этой функции дикий указатель , потому что img
не указывает на какой-либо действительный объект. Это может вызвать ошибку сегментации, как только функция разыменует дикий указатель, или вызвать другое неопределенное поведение , например перезапись других переменных в вашей программе.
Я предлагаю вам вместо этого напишите следующий код:
struct fp_img *img;
[...]
caps=fp_dev_img_capture(device,0,&img);
Теперь третий параметр указывает на допустимый объект (на переменную img
).
Поскольку img
теперь является единственным указателем и не двойной указатель, вы должны передать img
вместо *img
функциям fp_img_save_to_file
и fp_img_free
.
Эта вторая проблема, вероятно, является причиной вашей ошибки сегментации. Кажется, вам просто «повезло», что ваша программа не вышла из строя как отдельная программа.