【发布时间】:2015-11-23 21:38:57
【问题描述】:
我编写了一个程序来读取 BMP 文件头。 代码如下:
#include <stdio.h>
typedef unsigned short WORD;
typedef unsigned short BYTE;
typedef unsigned int DWORD;
typedef struct _WinBMPFileHeader {
WORD FileType;
DWORD FileSize;
WORD Reserved1;
WORD Reserved2;
DWORD BitmapOffset;
} WINBMPFILEHEADER;
int main(int argc, char* argv[]) {
WINBMPFILEHEADER *header = NULL;
FILE *fptr;
size_t bytes_read;
if (argc == 2) {
fptr = fopen(argv[1], "r");
bytes_read = fread(header, sizeof(WINBMPFILEHEADER), 1, fptr);
}
else
printf("The number of parameters is wrong.\n");
return 0;
}
当我运行程序时,由于 fread 出现分段错误。 这个故障的原因是什么?
【问题讨论】:
-
您只是假设文件已正确打开。永远不要假设外部资源会成功。如果 fopen() 失败,则返回 null。如果您随后尝试将该 null 用作文件指针,则会出现分段错误。
-
fread读取二进制流,但您的fopen确实说'r'而不是'rb'。另外,您在尝试打开文件后不检查错误,那么您如何知道文件实际上已成功打开并准备好读取? -
我知道程序在那时失败了,因为我检查了 printf 但我省略了它们只是为了节省空间。此外,gdb 还告诉您问题出在 fread 中。最后,我只是尝试使用 fopen(argv[1], "rb") 并再次失败。