我运行程序时为什么会出现“Segmentation Fault”?

时间:2013-06-03 22:58:20

标签: c image segmentation-fault ppm

我的程序解码被随机像素覆盖的图像,为了解码图像,我必须将每个像素的红色分量乘以10.绿色和蓝色分量与新的红色分量相同。我创建了多个辅助函数,使代码更容易在main中读取,但是当我尝试运行我的a.out时,我不断得到“Segmentation Fault”。我似乎无法找到我的错误!感谢帮助。

void check_argument(int arg_list)
{
   if (arg_list < 2)
   {
      perror("usage: a.out <input file>\n");
   }
}

void print_pixel(int a, FILE *out)
{
   int r, g, b;

   r = a * 10;

   if (r > 255)
   {
      r = 255;
   }

   g = r;
   b = r;

   fprintf(out, "%d\n", r);
   fprintf(out, "%d\n", g);
   fprintf(out, "%d\n", b);
}

void read_header(FILE *in)
{
   char str[20];

   for (int i = 0; i < 3; i++)
   {
      fgets(str, 20, in);
   }
}

FILE*  open_files(FILE *infile, char *input[])
{
   infile = fopen(input[1], "r");

   if (infile == NULL)
   {
      perror("Error: Cannot read file.\n");
   }

   return infile;
}

void decode(int arg_list, char *in[])
{
   FILE *input, *output;

   int check, red, green, blue;

   open_files(input, in);
   output = fopen("hidden.ppm", "w");

   fprintf(output, "P3\n");
   fprintf(output, "%d %d\n", 500, 375);
   fprintf(output, "255\n");

   read_header(input);
   check = fscanf(input, "%d %d %d", &red, &green, &blue);

   while (check != EOF)
   {
      print_pixel(red, output);
      check = fscanf(input, "%d %d %d", &red, &green, &blue);
   }

   fclose(input);
   fclose(output);
}

int main(int argc, char *argv[])
{
   check_argument(argc);
   decode(argc, argv);
}

2 个答案:

答案 0 :(得分:0)

由于这应该是家庭作业,我会试着向您展示一些常见的错误来源以及如何找到它们。

  1. 在此之前必须(应该)分配使用的变量。这特别适用于指针,例如。 G。 FILE *

  2. 如果函数(例如fopen())失败,它通常会通过返回一个特殊值来指示这一点,在继续之前必须检查该值。

  3. 要检查变量的值,您可以使用printf()进行显示。

  4. 这是为了查找诸如段错误之类的主要错误。

    但逻辑错误也很难找到:如果你读取3个值并将它们存储到变量中,那么使用它们而不是只使用其中一个可能更有用。 (但也许这个还不是这个练习的目标。)


    我在此之前编写了这些行,然后才知道在给定程序中搜索错误不是任务,而是自己编写程序,所以到现在为止我会更加具体。

    FILE *fopen()返回的内容。您可以将其返回,也可以将其写入由“更深层次”指针间接指向的变量或其他内存位置。

    所以你应该重写你的open_files()(BTW:为什么文件* s *?它目前只有一个......):

    要么返回值(可选):

    FILE* open_files(char *input[])
    {
       FILE *infile = fopen(input[1], "r");
    
       if (infile == NULL)
       {
          perror("Error: Cannot read file.\n");
       }
    
       return infile;
    }
    

    并用

    调用它
    input = open_files(input);
    

    或“以引用方式传递”:

    void open_files(FILE **infile, char *input[])
    {
       *infile = fopen(input[1], "r");
    
       if (*infile == NULL)
       {
          perror("Error: Cannot read file.\n");
       }
    
       return *infile;
    }
    

    并用

    调用它
    open_files(&input, in);
    

    只有这样你才能在调用者的网站上找到你的变量input

答案 1 :(得分:0)

调用open_files(input, in);后,您将无法在input中使用文件句柄。