将文件中的数据读入结构 (C)

Reading data from file into a struct (C)

抱歉,如果格式混乱,这是我第一次使用 Whosebug。 我正在尝试使用 fread 函数以 512 字节的块读入 card.raw 文件,并将该块的前 4 个字节存储到 s1-s4 中,剩下的 508 个字节存储到字节数组。但是,当我尝试 运行 时,出现分段错误。当我尝试调试时,调用fread函数后,argvoutptrinptrbuf值都变成了NULL。为什么会这样,我做错了什么?

typedef uint8_t  BYTE;

//block of 512 bytes
typedef struct 
{
    BYTE s1;
    BYTE s2;
    BYTE s3;
    BYTE s4;
    BYTE image[508];
}
BUFFER;

int main(int argc, char* argv[])
{
    //opens memory card file
    FILE* inptr = fopen("card.raw", "r");

    int jpgcounter = 0;

    //creates jpg file
    char title[7];
    sprintf(title, "%d.jpg", jpgcounter);
    FILE* outptr = fopen(title, "a");

    //create buf (pointer) of type BUFFER
    BUFFER* buf;

    do
    {
        //creates buffer structure for storage of 512B blocks 
        buf = malloc(sizeof(BUFFER));

        //read 512 bytes at a time & stores every 512B block into a buffer struct buf
        fread(&buf, sizeof(BUFFER), 1, inptr);

        if(buf->s1 == 0xff && buf->s2 == 0xd8 && buf->s3 == 0xff)
        {

if语句用于检查buf的前3个元素是否包含以下十六进制签名。我想在循环中使用 malloc 以读取 512 字节结构中的原始文件,决定如何处理 512 字节,然后连续释放它。

使用 fread(buf, sizeof(BUFFER), 1, inptr); 而不是 fread(&buf, sizeof(BUFFER), 1, inptr); 还以二进制模式打开文件以读取,即 "rb" 而不是 "r"

当您将 &buf 指针而不是 buf 传递给 fread 函数时,它不会将您的数据写入分配的堆缓冲区,而是写入您的函数堆栈。由于 x86 平台上的堆栈向较低的内存地址增长,这将覆盖堆栈上的所有内容,即在您的 buf 变量之前 - 在您的情况下是局部变量,函数参数 argcargv 等和 return 地址。堆栈损坏,出现分段错误。