【问题标题】:Segmentation fault while reading PPM读取 PPM 时出现分段错误
【发布时间】: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


【解决方案1】:
uint8_t **array=malloc (3*size[1]*size[0]*sizeof(uint8_t));

这不是 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。过错。现在我真的不知道错误可能在哪里
  • 尝试进行调试打印以准确了解分段错误发生的位置。不过,在 C 中,大多数分段错误是由于分配问题造成的。
  • 所以从底部算起的第三行可能存在问题 --- array[k][l] - 因为如果我将它更改为其他东西,例如某个常量,它会打印出一个不错的10x30 阵列。事件数组 [0][0] 不起作用(segm.fault)......
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多