我想将文件读入缓冲区。我在 fread()
处遇到段错误。看起来 ftell()
返回正确的大小。但后来事情出了问题。 fseek()
会修改f
吗?为什么 fread()
不起作用?
int pk_load_file( const char *filename )
{
FILE *f;
int size;
unsigned char *buf;
if( ( f = fopen( filename, "rb" ) ) == NULL )
return -1;
fseek( f, 0, SEEK_END );
if( ( size = ftell( f ) ) == -1 )
{
fclose( f );
return -2;
}
fseek( f, 0, SEEK_SET );
if( fread( buf, 1, size, f ) != size )
{
fclose( f );
return -3;
}
fclose( f );
return( 0 );
}
最佳答案
这里的问题是
if( fread( buf, 1, size, f ) != size )
在上述情况下,您使用的是未初始化的 buf
。在使用它之前,您需要为 buf
分配内存。
由于未初始化,buf
可以指向进程无法访问的任何内存位置。因此,尝试访问 buf
指向的内存会调用 undefined behaviour .
段错误是副作用之一。
解决方案:您可以使用 malloc()
将内存分配给 buf
和家人。
关于c - 将文件读入缓冲区,但调用 fseek 后程序在 fread 处崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31603804/