作为C中的函数参数的指针是NULL

时间:2014-01-06 13:44:59

标签: c pointers

请原谅任何无知 - 我对C相对较新。我有以下功能:

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()......但是实现到目前为止还没有找到我。

2 个答案:

答案 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)