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
非常有效地执行。