c - 将文件读入缓冲区,但调用 fseek 后程序在 fread 处崩溃

标签 c file-io segmentation-fault fread fseek

我想将文件读入缓冲区。我在 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/

相关文章:

c - 我怎样才能告诉 Linux 进程使用一个文件作为它的整个堆?

c - 如何使用 C 语言中的文件编写凯撒密码加密代码

c - 数组和指针字符串声明之间的差异

c - bash中 "variable indirection"在C中对应或最接近的概念是什么?

c - 在 pthread 中获取错误的 ID 值

c - 从两个子进程写入同一个文件

c++ - 基于数组的整数堆栈中的段错误和行为不当的数据成员

c++ - Xcode 5 控制台应用程序仅在通过 finder 启动时出现段错误

c - 在两个给定数字之间添加数字?

c++程序,用于将具有恒定(但未知)列数的未知大小的csv文件(仅填充 float )读取到数组中