C 为什么我会得到;分段故障“;在弗雷德?

C 为什么我会得到;分段故障“;在弗雷德?,c,segmentation-fault,cs50,C,Segmentation Fault,Cs50,当我运行valgrind时,我收到此消息 ==1175== Invalid write of size 8 ==1175== at 0x400923: main (recover.c:37) ==1175== Address 0x1ffec6e0a8 is on thread 1's stack ==1175== in frame #0, created by main (recover.c:10) 第37行是fread(已恢复,memSize,1,mem) 这是我的代码: type

当我运行
valgrind
时,我收到此消息

==1175== Invalid write of size 8
==1175==    at 0x400923: main (recover.c:37)
==1175==  Address 0x1ffec6e0a8 is on thread 1's stack
==1175==  in frame #0, created by main (recover.c:10)
第37行是
fread(已恢复,memSize,1,mem)

这是我的代码:

typedef uint8_t BYTE;
#define BLOCK 512

int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        printf("Invalid number of command-line arguments..\n");
        return 1;
    }

    FILE *mem = fopen(argv[1], "r");

    if(mem == NULL)
    {
        printf("The file could not be opened..\n");
        return 1;
    }

    fseek(mem, 0L, SEEK_END);
    int memSize = ftell(mem);
    
    rewind(mem);

    printf("%i\n", memSize);


    BYTE restored[memSize];

    fread(restored, memSize, 1, mem);
    fclose(mem);

    // rest of code ...

    return 0;
}

您的文件有多大?此
还原的
在堆栈上分配。所以可以很好地溢出它,这取决于系统。是的,一个3MIB可以很容易地溢出堆栈。使用
malloc
分配足够大的内存一般来说,segmentation fault=你把某个地方的内存弄乱了。专业提示:如果你想将整个文件读入内存,你可以使用
mmap
来非常有效地执行。你的文件有多大?这个
还原的
是在堆栈上分配的。所以可以很好地溢出它,这取决于系统。是的,一个3MIB可以很容易地溢出堆栈。使用
malloc
分配足够大的内存一般来说,segmentation fault=你把某个地方的内存弄乱了。专业提示:如果你想将整个文件读入内存,你可以使用
mmap
非常有效地执行。