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

时间:2017-10-03 14:06:48

标签: c fread stdio unsigned-char

我写了这个函数来返回包含来自任何文件(使用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);

然而,当从has_checksum(argv[2]);致电int main()时,我得到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)

我测试char *f_name中的get_file_data()每次都是相同的(在输入printf("%s\n", f_name);时立即使用get_file_data()),而且确实如此。

系统
- VM Ubuntu 17.04(64位) - VirtualBox

1 个答案:

答案 0 :(得分:0)

你在两种情况下都传递了一个未初始化的指针,但你在$中得到了“幸运”,它似乎有效。您需要传递实际整数的地址:

main()

你看,当你宣布luint len; uchar *dat = get_file_data(argv[2], &len); 时,你已经宣布了一个指针,但没有指向它。它包含一个未初始化的值,可能指向任何位置。您可能会也可能无法写入该位置。