【发布时间】:2017-09-18 03:11:46
【问题描述】:
谁能告诉我为什么在运行此代码时会出现分段错误?我正在尝试打开一个 P6 格式的 PPM 文件,第二行有它的尺寸,第三行有一个 255 常量。 下面是代表每个像素的数字“二维数组”。我知道每个像素 (RGB) 有 3 个数字,但我仍然希望将它们全部放在 2D 数组中(一个像素的 3 种颜色彼此相邻)(这就是我将 size[1] 乘以 3 的原因),但我我遇到了分段错误。
感谢您的帮助:)
#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;
}
【问题讨论】:
-
fread(array, size[0]*size[1]*3 , 1, f);将包括newline跟在Constant(255) 之后。 -
我是一个初学者,你能告诉我一个更好的方法吗?
-
看到你使用的是P6格式后,我改变了之前的评论。但是您至少必须将数据与数组对齐。
-
我认为如果你只是将指针传递给“数组”,它会将元素一个接一个地放在那里。在那里对齐到底是什么意思?
-
我的意思是
255之后的newline是将从文件中读取的下一个字节。
标签: c file segmentation-fault fread ppm