如果被其他函数使用,读取二进制文件的 C 函数不起作用。?

C function to read binary file doesn't work if used by other function.?

我把这个函数写到 return 一个 unsigned char * 包含来自任何文件的数据(使用 rb 读取模式)它看起来像这样:

uchar * get_file_data (char *f_name, luint *len) {

    // verify file
    struct stat sBuffer;
    int iRc;

    iRc = stat(f_name, &sBuffer);
    if (iRc != 0) {
        printf("Failed to get file size\n");
        exit(3);
    }

    // read file
    FILE *fp;
    fp = fopen(f_name, "rb");
    if (fp == NULL) {
        printf("Failed to open file\n");
        exit(3);
    }

    uchar *buff = (uchar *) malloc(sBuffer.st_size);
    *len = fread(buff, 1, sBuffer.st_size, fp);
    fclose(fp);

    return buff;

}

类型:

typedef unsigned char uchar;
typedef unsigned long int luint;

现在这在 int main() 函数中的 运行 时有效,如下所示:

luint *len;
uchar *dat = get_file_data(argv[2] /* argument congaing filename */, len);
print_uchar(dat, len);
free(dat);

然而,当从 int main() 调用 has_checksum(argv[2]); 时,我得到一个 Segmentation fault (core dumped),尽管使用看起来是一样的。

int has_checksum (char *f_name) {

    luint *p_len;
    uchar *p_f_data = get_file_data(f_name, p_len); /* this fails */

    /* more code, never reached */

}

当我尝试 运行使用以下 main() 设置我的程序时:

int main(int argc, char **argv) {

    // verifying other arguments (not filename) */

    luint *len;
    uchar *dat = get_file_data(argv[2], len);
    print_uchar(dat, len);
    free(dat);

    has_checksum(argv[2]);

    return 0;
}

我得到这个输出:

$ ./md5 -add ../<filename> 
<file contents (correct)>
Segmentation fault (core dumped)

我测试了get_file_data()中的char *f_name是否每次都相同(输入get_file_data()时立即使用printf("%s\n", f_name);),是。


系统:
-- 虚拟机 Ubuntu 17.04(64 位)-- VirtualBox

您在这两种情况下都传递了一个未初始化的指针,但您在 main() 中得到了 "lucky" 并且它似乎有效。您需要传递一个实际整数的地址:

luint len;
uchar *dat = get_file_data(argv[2], &len);

你看,当你声明 luint *len; 时,你已经声明了一个指针,但没有任何东西可以指向。它包含一个未初始化的值,可以指向任何地方。您可能无法写入该位置。