当我使用 fread 处理 34 mb .mp4 文件时,出现分段错误,如何解决?

问题描述 投票:0回答:1

我正在尝试编写可以反转文件以使其不可读的代码。我在 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

}

我得到:

分段错误 [程序完成]

c file segmentation-fault fread
1个回答
0
投票

当您在这样的函数内声明变量时,您是在堆栈上声明它。它足够大,可以容纳很多普通变量,但通常没有足够的内存来容纳大数组。如果你想存储大物体,你必须使用

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 语言非常重要的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.