C函数退出时,函数指针参数不一样

时间:2014-10-08 06:45:54

标签: c function pointers

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

所以我传递了一个指向函数的指针,该函数获取原始图像数据,然后将其存储在指针引用的内存中。

如果我然后将指针从原始图像函数内部传递给函数以从原始数据创建JPEG文件,那么它可以正常工作。

如果我先等待原始图像功能完成,然后使用传递给原始图像功能的指针调用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()函数来自我链接的第三方库,因此我无法更改定义。

2 个答案:

答案 0 :(得分:1)

鉴于rawData中的main()是一个空指针,您几乎肯定需要将接口修改为getRawImage(),以便它需要char **并且您通过{{ 1}}到它。您还需要考虑调用代码如何知道数据的大小。

答案 1 :(得分:0)

我设法解决了这个问题。感谢所有指导我的解决方案:

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;
}