我得到一个奇怪的分段错误:当我使用gcc -std = gnu90运行此C文件时出现11错误。从我读到的,我的代码中的某个地方超出了内存?但是,经过大量的调试后,我不确定它在哪里超过。对于一个小的bmp文件,我分别给出160和240的高度和宽度。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void brighten(int,int,char*);
//void contrast(int height, int width, char* file);
//void rotation(int height, int width, char* file);
#define HEADER_SIZE 54
int main(void) {
printf("Enter the filename: ");
char file[256];
scanf("%s", file);
printf("Enter the height and width (in pixels): ");
int height, width;
scanf("%d %d",&height,&width);
strcat(file,".bmp");
brighten(height,width,file);
//contrast(height,width,file);
//rotation(height,width,file);
return 0;
}
void brighten(int height, int width, char* file) {
FILE *input = fopen(file,"rb");
FILE *output = fopen("copy1.bmp","wb");
char header[HEADER_SIZE];
unsigned char pixels[height][width * 3];
fread(header,1,HEADER_SIZE,input);
fread(pixels,1,height * width * 3,input);
int r, c;
for( r = 0; r < height; r++) {
for(c = 0; c < width * 3; c++) {
pixels[r][c] += 50;
if( pixels[r][c] > 255) {
pixels[r][c] = 255;
}
printf(" %c \n",pixels[r][c]);
}
}
fwrite(header,sizeof(char), HEADER_SIZE,output);
fwrite(pixels,sizeof(char),height * width * 3, output);
fclose(input);
fclose(output);
}
答案 0 :(得分:1)
如@Chris评论,您应该检查fopen()
是否返回NULL
。对NULL
指针执行读/写操作会导致分段错误。
根据GNU C Library手册:
由于各种原因(但不限于),如果打开失败,
fopen()
将返回空指针。
fopen()
可能会给NULL
值:
如果fopen()
返回NULL
,建议您检查errno。