我正在try 编写可以反转文件以使其不可读的代码.我在Python语言中这样做了,我正在try 用C语言再次这样做,但当我使用FREAD读取大文件时,我得到了一个分段错误(对于1MB或2MB的文件,这种情况不会发生),有什么我可以做的来解决这个问题吗?

我try 使用以下代码:

#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
}

我得到了:

分段故障 [节目结束]

推荐答案

当您在这样的函数中声明变量时,您就是在堆栈上声明它.它足够大,可以容纳许多普通变量,但通常没有足够的内存来容纳大型array.如果要存储大对象,则必须使用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语言中非常重要的一部分.

C++相关问答推荐

你能用自己的地址声明一个C指针吗?

为什么getchar()挂起了,尽管poll()返回了一个好的值?""

了解一些CLIPS原语数据类型

如何判断宏参数是否为C语言中的整型文字

如何正确地索引C中的 struct 指针数组?

我编译了一个新的c程序,并收到以下错误

如何将字符串传递给函数并返回在C中更改的相同字符串?

GCC不顾-fno-Builtin-SINCOS旗帜向SINCOS发出呼唤

如何编写一个for循环来计算C中各项的总和?

在进程之间重定向输出和输入流的问题

链接器脚本和C程序使用相同的头文件,这可能吗?

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

无算术运算符和循环的二进制乘法

分配给静态变量和动态变量的位置之间有区别吗?

C: NULL>;NULL总是false?

与指针的原始C数组或C++向量<;向量<;双>>;

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?

C 语言中霍尔分区的快速排序算法

如何根据当前舍入方向将float转换为int?

c 函数指针,另一种语法