函数退出时C函数指针参数不相同

函数退出时C函数指针参数不相同,c,function,pointers,C,Function,Pointers,我在向函数传递指针时遇到问题。当函数返回时,指针似乎与函数中的指针不同 因此,我向函数传递一个指针,该函数获取原始图像数据,然后这些数据应该存储在指针引用的内存中 然后,如果我将指针从raw image函数内部传递给一个函数,以便从原始数据创建JPEG文件,那么它将正常工作 如果我首先等待raw image函数完成,然后使用传递给raw image函数的指针调用JPEG函数,那么它将无法创建图像 代码的简化版本如下: int getRawImage(unsigned char *pBuffer)

我在向函数传递指针时遇到问题。当函数返回时,指针似乎与函数中的指针不同

因此,我向函数传递一个指针,该函数获取原始图像数据,然后这些数据应该存储在指针引用的内存中

然后,如果我将指针从raw image函数内部传递给一个函数,以便从原始数据创建JPEG文件,那么它将正常工作

如果我首先等待raw image函数完成,然后使用传递给raw image函数的指针调用JPEG函数,那么它将无法创建图像

代码的简化版本如下:

int getRawImage(unsigned char *pBuffer);
int writeJPEGBFile(unsigned char *idata, char *ofile);

int main(int argc, char** argv) {
    unsigned char *rawData = NULL;
    char filename[MAXPATHLEN] = "/home/user/tst/img.jpg";

    getRawImage(rawData);
    // This does not work
    writeJPEGBFile(rawData, filename);
    free(rawData);
    return 0;
}

int getRawImage(unsigned char *pBuffer) {
    void *hDevice;

    hDevice = scanOpenDevice();
    // Removed code for simplification
    scanGetFrame(hDevice, pBuffer, NULL)
    scanCloseDevice(hDevice);
    // This Works!!
    //char filename[MAXPATHLEN] = "/home/user/tst/img.jpg";
    //writeJPEGBFile(pBuffer, filename);
    return 0;
}

int writeJPEGBFile(unsigned char *idata, char *ofile) {
    // JPEG code goes here
    return 0;
}
我的问题是我做错了什么,如何在main()函数中成功地将rawData指针传递给writeJPEGBFile()函数


scanGetFrame()的定义如下:

typedef void *FTR_PVOID;
FTR_API_PREFIX FTR_BOOL FTR_API ftrScanGetFrame( FTRHANDLE ftrHandle, FTR_PVOID pBuffer, PFTRSCAN_FRAME_PARAMETERS pFrameParameters );

scanGetFrame()函数来自我正在链接的第三方库,因此我无法更改定义。

鉴于
rawData
main()
中的空指针,您几乎肯定需要将接口修改为
getRawImage()
这样它需要一个
字符**
,然后您将
&rawData
传递给它。您还需要考虑调用代码如何知道数据有多大。

我设法解决了这个问题。感谢大家的指点,让我找到了解决方案:

int getRawImage(unsigned char *pBuffer);
int writeJPEGBFile(unsigned char *idata, char *ofile);

int main(int argc, char** argv) {
    unsigned char *rawData; // Removed the NULL assignment
    char filename[MAXPATHLEN] = "/home/user/tst/img.jpg";

    // Set the size of rawData - loadImageSize() sets the value of the ImageSize class variable.
    loadImageSize();
    rawData = (unsigned char *) malloc(ImageSize.nImageSize);

    getRawImage(rawData);
    // This works now
    writeJPEGBFile(rawData, filename);
    free(rawData);
    return 0;
}

int getRawImage(unsigned char *pBuffer) {
    void *hDevice;

    hDevice = scanOpenDevice();
    // Removed code for simplification
    scanGetFrame(hDevice, pBuffer, NULL)
    scanCloseDevice(hDevice);
    return 0;
}

int writeJPEGBFile(unsigned char *idata, char *ofile) {
    // JPEG code goes here
    return 0;
}

scanGetFrame
是如何添加数据的?在指针变量传递到
writeJPEGBFile
之前,您是否尝试过在这两种情况下打印指针变量?看起来
scanGetFrame
是一个宏,其地址为
pBuffer
或类似的地址。否则我就看不出这有什么用了。您能否发布
scanGetFrame
的定义?谁负责分配rawData指向的内存?你有一个免费的,但我在代码中看不到任何malloc。如果getRawImage必须更改指针,则它必须获得一个字符**,而不是一个字符*。内存在getRawImage()中分配如下:pBuffer=(无符号字符*)malloc(ImageSize.nImageSize);考虑到scanGetFrame()希望参数2为char*,您能建议一个可能的解决方案吗?这是我的第一个C项目,虽然我已经使用PHP、Java和C#多年了,但我仍然习惯于C指针和内存分配。谢谢您的时间。我希望将
FTR\u PVOID
解释为“指向void的指针”或
void*
,但它可能被映射到
char*
。因为我对图书馆一无所知,对不起,我不能再帮你了。您需要知道函数的作用,以及它的接口应该如何工作。没有手册,什么也做不了。谷歌搜索
ftrScanGetFrame
似乎建议将Futronics指纹读取器作为库,但您应该确定这是否是您正在使用的,以及库及其文档的规范URL。