读取PPM时出现分段错误

时间:2017-04-21 08:07:09

标签: c file segmentation-fault fread ppm

有人可以告诉我为什么在运行此代码时出现分段错误?我试图打开一个P6格式的PPM文件,在第二行有它的维度,在第三行有一个255常量。 下面是一个" 2D阵列"代表每个像素的数字。我知道每个像素(RGB)有3个数字,但我仍然希望将它全部放在2D数组中(一个像素的3种颜色彼此相邻)(这就是为什么我将大小[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;
}

2 个答案:

答案 0 :(得分:0)

uint8_t **array=malloc (3*size[1]*size[0]*sizeof(uint8_t));

这不是malloc 2D阵列的好方法。你首先必须使用&#34;行&#34;在你的数组中,然后malloc的数量&#34;列&#34;对于数组的每一行。

尝试将其替换为:

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));

答案 1 :(得分:0)

我有它!!!!!问题在于阅读文件的元素。它应该看起来像

class MyEntryRendererPassword : EntryRenderer
{
    //CUSTOM entry RENDER PER ANDROID
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);
        if (Control != null)
        {
            Control.SetMaxHeight(150);
            Control.SetTextColor(Android.Graphics.Color.Rgb(255,255,255));
            Control.SetBackgroundColor(Android.Graphics.Color.Rgb(43, 50, 58));
            //Control.SetRawInputType(InputTypes.TextFlagNoSuggestions | InputTypes.TextVariationVisiblePassword);

        }
    }
}