我正在尝试编写可以反转文件以使其不可读的代码。我在 Python 中完成了此操作,并且尝试在 C 中再次执行此操作,但是当我使用 fread 读取大文件时,出现分段错误(对于 1 或 2 mb 的文件,不会发生这种情况),有什么问题吗?我能做些什么来解决这个问题吗?
我尝试使用此代码:
#include <stdio.h>
#include <conio.h>
int main()
{
FILE *fh=fopen("vid.mp4","rb");
FILE *fh1=fopen("vid1.png","wb");
int fsize=36886031;
char data[fsize];
fread(data,fsize,1,fh); //<-- error
fwrite(data,fsize,1,fh1); //<-- error too
}
我得到:
分段错误 [程序完成]
当您在这样的函数内声明变量时,您是在堆栈上声明它。它足够大,可以容纳很多普通变量,但通常没有足够的内存来容纳大数组。如果你想存储大物体,你必须使用
malloc
。
在这里,我修改了您的代码以免崩溃。
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fh=fopen("vid.mp4","rb");
size_t fsize = 36886031;
char *data = malloc(fsize);
if (data == NULL) {
fprintf(stderr, "Not enough memory");
return EXIT_FAILURE;
}
fread(data, fsize, 1, fh);
free(data); // Don't forget to free this memory
return EXIT_SUCCESS;
}
我强烈建议阅读有关动态内存分配的内容,因为它是 C 语言非常重要的一部分。