阅读PPM时出现分段错误
有没有人可以告诉我为什么在运行此代码时遇到分段错误?我试图用P6格式打开一个PPM文件,第二行有它的维度,第三行有一个255常量。 下面是代表每个像素的数字的“二维数组”。我知道每个像素(RGB)有3个数字,但我仍然希望将它全部放在二维数组中(一个像素相邻的三种颜色)(这就是为什么我将size [1]乘以3),但是我我正在分段错误。阅读PPM时出现分段错误
感谢您的帮助:)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <unistd.h>
int main(int argc, char*argv[]){
char *fname = argv[1];
FILE* f = fopen(fname, "r");
char format[3];
int size[2];
//reading image format
fscanf(f,"%s", format);
printf("%s\n", format);
//reading size
fscanf(f,"%d %d", size, size+1);
printf("%d %d\n", size[0], size[1]);
//reading a constant - 255
int Constant=0;
fscanf(f,"%d", &Constant);
//mallocating a 2D array to store individual pixels
uint8_t **array=malloc (3*size[1]*size[0]*sizeof(uint8_t));
//reading pixels from file and storing into array
for(int i=0 ; i<size[1]; i++){
for(int j=0 ; j<size[0]*3 ; j++){
fread(array, size[0]*size[1]*3 , 1, f);
}
}
for(int k=0;k<size[1];k++){
for(int l=0; l<size[0]*3; l++){
printf("%d ", array[k][l]);
}
printf("\n");
}
return 0;
}
uint8_t **array=malloc (3*size[1]*size[0]*sizeof(uint8_t));
这并不是malloc的二维数组的好办法。你首先必须malloc数组中的“行数”,然后malloc数组中每行的“列数”。
尝试通过替换它:
uint8_t **array = malloc(size[1] * sizeof(uint8_t*));
for (size_t i = 0; i < size[1]; ++i)
array[i] = malloc(3 * size[0] * sizeof(uint8_t));
,仍然得到Segm。故障。现在我真的不知道错误可能在哪里 – lauderdice
尝试将调试打印件确切地知道发生了段错误的位置。在C中,大多数分段错误都是由于分配问题。 – Silveris
因此,从底部开始的第三行可能存在一个问题--- array [k] [l] - 因为如果我将其更改为其他常量,例如打印出一个漂亮的10x30数组。事件数组[0] [0]不会工作(segm.fault)...... – lauderdice
我有!!!!!问题在于读取文件的元素。它应该看起来像
for(int i=0 ; i<size[1]; i++){
for(int j=0 ; j<size[0]*3 ; j++){
fread(*array, size[0]*size[1]*3 , 1, f);
}
}
'的fread(数组,大小[0] *尺寸[1] * 3,1,F);'将包括'newline'下面'Constant'(255)。 –
我是一个初学者,你能告诉我一个更好的方法吗? – lauderdice
在看到您使用P6格式后,我更改了以前的评论。但是你至少必须将datya与数组对齐。 –