int get_fingerprint_device(struct fp_dev *device) {
struct fp_dscv_dev **devices;
int rtn;
if (!(devices = fp_discover_devs())) {
rtn = -1;
}
else {
if (!(device = fp_dev_open(*devices))) {
rtn = -2;
}
else {
if (device) {
printf("Device OK\n");
}
rtn = 1;
}
fp_dscv_devs_free(devices);
}
return rtn;
}
我有一个main()如下:
int main(void)
{
// Vars
struct fp_dev *device;
struct fp_print_data **print_data;
struct fp_img **img;
int err;
// Init libfprint
fp_init();
// Get the first fingerprint device
if ((err = get_fingerprint_device(device)) < 0) { // Errorz
if (err == -1) {
error("No devices found");
}
else if (err == -2) {
error("Couldn't open the device");
}
return 1;
}
if (device == NULL) {
printf("No\n");
return 1;
}
else {
printf("Yes\n");
return 0;
}
fp_enroll_finger_img(device, print_data, img);
// Deinit libfprint
fp_exit();
return 0;
}
运行时的结果是它首先打印“设备正常”,然后打印“否”。
为什么设备是get_fingerprint_device()中的有效指针,但在main()中却没有?我的理解是我应该在这里使用双指针,以便内部指针值可以改变并传播回main()......但是实现到目前为止还没有找到我。
答案 0 :(得分:1)
这是因为device
按值传递到get_fingerprint_device
。换句话说,该函数获得自己的device
指针副本。然后它为它分配了一些东西,但是在该函数之外看不到变化,所以一旦它返回,调用者(在这种情况下为main
)就看不到任何变化。如果你希望这个工作,你必须将指针指向get_fingerprint_device
函数(即struct fp_dev **device
)。
答案 1 :(得分:0)
你对在C中传递指针感到有点困惑 - 目前你只是传递“狂野”(未分配)指针。你应该改变:
struct fp_dev *device;
为:
struct fp_dev device;
并改变:
if ((err = get_fingerprint_device(device)) < 0)
为:
if ((err = get_fingerprint_device(&device)) < 0)