我使用下面的代码
char *es_data;
fp_input = fopen(inp_path, "rb");
fseek(fp_input, 0, SEEK_END);
file_size = ftell(fp_input);
fseek(fp_input, 0, SEEK_SET);
es_data = (char*)malloc(file_size);
fread(es_data, 1, file_size, fp_input);
我有一个185mb的文件,即file_size = 190108334个字节。对于这个文件,malloc崩溃了,程序在这个阶段受到了打击。 如果我使用任何其他较小的文件,它工作正常。 我能做什么 ?
答案 0 :(得分:1)
您至少应该测试fopen
成功:
fp_input = fopen(inp_path, "rb");
if (!fp_input) { popen(inp_path); exit(EXIT_FAILURE); };
您的malloc
可能没有崩溃,但失败(通过返回NULL
):至少阅读malloc(3)代码:
es_data = malloc(file_size);
if (!es_data) { perror("malloc"); exit(EXIT_FAILURE); }
顺便说一下,你可能想要memory map一个文件。如果您使用的是Linux或Posix系统,请了解mmap(2)(并使用fstat(2)查询open(2) - ed文件描述符的大小。 Windows还可以使用CreateFileMapping 对内存映射文件
如果您的malloc
确实崩溃,这可能意味着您拥有memory corruption(在malloc
之前调用),因此系统的内部不变量{{}违反了1}}。使用一些memory debugger工具(如Linux上的valgrind或Windows上的purify)来检测它。