c - C内存读写BMP文件错误

标签 c memory memory-leaks out-of-memory fread

我正在尝试编写一个程序来反转图像的颜色。我的问题是当我尝试读取 BMP 文件中的 DIB header 时。

当我尝试获取文件头大小并使用 fread(dib.fileheader, 4,1,fp); 时。我收到一条错误消息“无法写入内存”。我已附上它以供进一步说明。

enter image description here

这是我的代码:

#include <stdio.h>
#include <string.h>


 struct BMP {
char filetype[2]; // must be BM, must check if BM
unsigned int filesize;
short        reserved1;
short        reserved2;
unsigned int dataoffset;

};

    struct DIB {
unsigned int  fileheader;
unsigned int headersize;
int          width;
int          height;
short        planes;
short        bitsperpixel;  /* we only support the value 24 here */
unsigned int compression;   /* we do not support compression */
unsigned int bitmapsize;
int          horizontalres;
int          verticalres;
unsigned int numcolors;
unsigned int importantcolors
  };
    struct pixel {
int val;
char * def;
struct listitem * next;
  };


 void invertImage(char fileName[]){

  struct BMP bmp;
  struct DIB dib;


     FILE *fp = fopen(fileName, "rb");

//FileType
 fread(bmp.filetype, 1,2,fp);
  printf("Value is %c\n", bmp.filetype[1]);

   //Check if file format is BM
  if(bmp.filetype[0] != 'B' && bmp.filetype[1] !='M'){
   printf("Wrong format");
  }
    //Size of the file in bytes
    fread(bmp.filesize, 4,1,fp);
    printf("Value is %d\n", bmp.filesize);
    //Go to dataoffset
    fseek(fp,10,SEEK_CUR);

    fread(bmp.dataoffset, 4,1,fp);
    printf("Offset is %d\n", bmp.dataoffset);


    fread(dib.fileheader, 4,1,fp);
    printf("File header is %d bytes\n", dib.fileheader);


    fclose(fp);

    }

   int main(int argc, char *argv[] ){

   printf("Program name %s\n", argv[0]);


   if( strcmp(argv[1],"-invert") == 0) {
  printf("Invert\n");
  printf("File name is %s\n", argv[2] );

  invertImage(argv[2]);

  }

   else {
  printf("Greyscale\n");
  //greyScaleImage();
   }

  return 0;

    }

这也是我的程序的输出。

enter image description here

最佳答案

fread 需要一个指向内存的指针来写入文件内容。所以你需要给它dib.fileheader

的地址
fread( &dib.fileheader, sizeof(dib.fileheader),1,fp );
printf("File header is %d bytes\n", dib.fileheader);

它会提示,因为它将 dib.fileheader 中的任何内容解释为要写入的地址,该地址可能对您的程序有效,也可能无效。

请注意,以下内容是可以的,因为 bmp.filetype 已经是一个指向 char 的指针 - 它是一个 char[]

fread(bmp.filetype, 1,2,fp);
printf("Value is %c\n", bmp.filetype[1]);

为了让它更通用一点,你可以这样写

fread(bmp.filetype, sizeof(bmp.filetype), 1, fp);
printf("Value is %c\n", bmp.filetype[1]);

关于c - C内存读写BMP文件错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39814340/

相关文章:

c - 使用 C 将逗号分隔的文本文件数据扫描到数组中

python - 大型 celery 任务内存泄漏

javascript - 如何找出React Native应用程序中的内存泄漏?

sql-server - sql server中的解析树缓存对象类型是什么

c++ - 获取堆上分配的 block 数以检测内存泄漏

css - 在 C 代码中更改 GtkToggleToolButton 的文本颜色 (GTK+3)

在 C 程序中将红绿蓝文件组合成 .ppm 文件

c - Eratosthenes 筛法错误输出

c++ - 如何释放 unordered_map 内存?

c++ - 处理曲面 vector 时如何正确使用 SDL_FreeSurface