【问题标题】:Why am I getting "Segmentation Fault" when I run my program?为什么我在运行程序时会出现“分段错误”?
【发布时间】:2013-06-03 22:58:19
【问题描述】:

我的程序解码由随机像素覆盖的图像,要解码图像,我必须将每个像素的红色分量乘以 10。绿色和蓝色分量与新的红色分量具有相同的值。我创建了多个辅助函数,以使代码在 main 中更易于阅读,但是当我尝试运行我的 a.out 时,我不断收到“分段错误”。我似乎找不到我的错误!感谢您的帮助。

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

【问题讨论】:

  • 您在哪里收到错误消息?
  • 使用 gcc -std=c99 -Wall -pedanticuzzle.c 编译后,我得到了 a.out 文件。但是当我尝试使用命令行参数运行 a.out 文件时,它告诉我:“分段错误”。
  • 嗯,我不认为我可以使用调试器来解决这个问题。 :(
  • @Karen 您的评论与您的​​问题相矛盾:在您的问题(标题和文本)中,您在编译时得到þe segfault,在您的评论中,您在运行时得到它。请更正。
  • 你不能使用调试器,但你可以在网上找人找问题?

标签: c image segmentation-fault ppm


【解决方案1】:

调用open_files(input, in); 后,您将没有input 中的文件句柄。

【讨论】:

  • 是的!谢谢!我找到了! :)
【解决方案2】:

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

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

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

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

这是用于查找主要错误,例如段错误。

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


我之前写了这几行,然后才知道不是在给定程序中搜索错误,而是自己编写程序,所以现在我会更具体一点。

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

所以你应该重写你的open_files()(顺便说一句:为什么文件*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

【讨论】:

    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    相关资源
    最近更新 更多