从函数返回结构给我分割错误

问题描述 投票:1回答:1

因此,我试图读取位图标头(54个字节),并使用函数将其保存到结构中。但是,当我尝试打印结果时,它给我带来了分割错误。

bmp.c

#include "bmp.h"
#include <stdlib.h>
#include <string.h>


struct bmp_header* read_bmp_header(FILE* BMP_file){
    if(BMP_file == NULL){
      return 0;
    }

    struct bmp_header* Header;

    memset(&Header, 0, sizeof(struct bmp_header));
    fread(&(Header->type), 2, 1, BMP_file); 
    fread(&(Header->size),4,1,BMP_file); 
    fread(&(Header->reserved1),2,1,BMP_file); 
    fread(&(Header->reserved2),2,1,BMP_file); 
    fread(&(Header->offset),4,1,BMP_file); 
    fread(&(Header->dib_size),4,1,BMP_file); 
    fread(&(Header->width),4,1,BMP_file); 
    fread(&(Header->height),4,1,BMP_file); 
    fread(&(Header->planes),2,1,BMP_file); 
    fread(&(Header->bpp),2,1,BMP_file); 
    fread(&(Header->compression),4,1,BMP_file); 
    fread(&(Header->image_size),4,1,BMP_file); 
    fread(&(Header->x_ppm),4,1,BMP_file); 
    fread(&(Header->y_ppm),4,1,BMP_file); 
    fread(&(Header->num_colors),4,1,BMP_file); 
    fread(&(Header->important_colors),4,1,BMP_file); 
    return Header;
}

bmp.h

#ifndef _BMP_H
#define _BMP_H

#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>


#define PADDING_CHAR "\0"

/**
 * Structure contains information about the type, size, layout, dimensions
 * and color format of a BMP file. Size of structure is 54 bytes.
*/
struct bmp_header{
    uint16_t type;              // "BM" (0x42, 0x4D)
    uint32_t size;              // file size
    uint16_t reserved1;         // not used (0)
    uint16_t reserved2;         // not used (0)
    uint32_t offset;            // offset to image data (54B)
    uint32_t dib_size;          // DIB header size (40B)
    uint32_t width;             // width in pixels
    uint32_t height;            // height in pixels
    uint16_t planes;            // 1
    uint16_t bpp;               // bits per pixel (1/4/8/24)
    uint32_t compression;       // compression type (0/1/2) 0
    uint32_t image_size;        // size of picture in bytes, 0
    uint32_t x_ppm;             // X Pixels per meter (0)
    uint32_t y_ppm;             // X Pixels per meter (0)
    uint32_t num_colors;        // number of colors (0)
    uint32_t important_colors;  // important colors (0)
} __attribute__((__packed__));


/**
 * Reads BMP header from input stream
 *
 * Reads and returns BMP header from opened input stream. The header is located
 * at it's beginning. If the stream is not opened or it is corrupted, function
 * returns `NULL`.
 *
 * @param stream opened stream, where the image data are located
 * @return `bmp_header` structure or `NULL`, if stream is not open or broken
 */
struct bmp_header* read_bmp_header(FILE* stream);


#endif

main.c

#include "bmp.c"

int main(){
  FILE *BMP_file = fopen("./assets/lenna.bmp", "rb");

  struct bmp_header* Header;
  memset(&Header, 0, sizeof(struct bmp_header));
  Header = read_bmp_header(BMP_file);
  printf("%x\n", Header->type); 
  fclose(BMP_file);
  return 0;
}

我已经尝试通过将结构“ bmp_header”作为参数添加到函数中来执行此操作(因此该函数将为空。但是,关键是-bmp.h不应该被触摸。

c data-structures bitmap
1个回答
0
投票

您正在用行将指向标题的指针实例化

struct bmp_header* Header;

但是在我看来,您想实例化实际对象,因此请尝试删除*。


0
投票

问题是,说

 struct bmp_header* Header;

您刚刚为指针分配了内存,但是指针没有指向任何有效的内存。您需要先将指针指向有效的内存位置,然后才能使用它。

© www.soinside.com 2019 - 2024. All rights reserved.