C 读取PPM时出现分段错误

C 读取PPM时出现分段错误,c,file,segmentation-fault,fread,ppm,C,File,Segmentation Fault,Fread,Ppm,谁能告诉我为什么我在运行这个代码时会出现分段错误?我试图打开一个P6格式的PPM文件,第二行是它的维度,第三行是255常量。 下面是代表每个像素的数字“2D数组”。我知道每个像素(RGB)有3个数字,但我仍然希望所有数字都在2D阵列中(一个像素的3种颜色彼此相邻)(这就是我将大小[1]乘以3的原因),但我遇到了分割错误 谢谢你的帮助:) #包括 #包括 #包括 #包括 int main(int argc,char*argv[]){ char*fname=argv[1]; 文件*f=fopen(f

谁能告诉我为什么我在运行这个代码时会出现分段错误?我试图打开一个P6格式的PPM文件,第二行是它的维度,第三行是255常量。 下面是代表每个像素的数字“2D数组”。我知道每个像素(RGB)有3个数字,但我仍然希望所有数字都在2D阵列中(一个像素的3种颜色彼此相邻)(这就是我将大小[1]乘以3的原因),但我遇到了分割错误

谢谢你的帮助:)

#包括
#包括
#包括
#包括
int main(int argc,char*argv[]){
char*fname=argv[1];
文件*f=fopen(fname,“r”);
字符格式[3];
整数大小[2];
//读取图像格式
fscanf(f,“%s”,格式);
printf(“%s\n”,格式);
//读数大小
fscanf(f,“%d%d”,大小,大小+1);
printf(“%d%d\n”,大小[0],大小[1]);
//读取常数-255
int常数=0;
fscanf(f、%d、&常数);
//定位2D阵列以存储单个像素
uint8_t**array=malloc(3*size[1]*size[0]*sizeof(uint8_t));
//从文件中读取像素并存储到阵列中
对于(int i=0;i
这不是对2D数组进行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));
uint8\u t**array=malloc(大小[1]*sizeof(uint8\u t*);
对于(大小i=0;i
我有它!!!!!问题在于读取文件的元素。它应该看起来像

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 i=0;i
fread(数组,大小[0]*size[1]*3,1,f);
将包括
常量之后的
换行符.我是个初学者,你能告诉我一个更好的方法吗?在看到你使用P6格式后,我改变了之前的评论。但你至少必须将datya与数组对齐。我想如果你只传递指向“数组”的指针它将把元素一个接一个地放在那里。你把它对齐到底是什么意思?我的意思是
255
之后的
换行符是将从文件中读取的下一个字节。尝试过了,仍然会得到Segm.fault。现在我真的不知道错误会发生在哪里,可以通过放置调试打印来准确地知道段在哪里正在发生分割错误。在C中,大多数分割错误都是由于分配问题造成的。因此,从底部开始的第三行可能存在问题—数组[k][l]——因为如果我将其更改为其他常量,例如,它将打印出一个漂亮的10x30数组。事件数组[0][0]无法工作(segm.fault)。。。。。。
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));
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);
    }
}