当我尝试运行测试时,为什么会出现“Segmentation Fault”错误?

时间:2013-05-28 02:08:15

标签: c string

我编写了一个函数,用于确定是否分配默认值(如果该标志不存在,则分配默认值,并指定用户在标志存在时传递的值)。我正在尝试用字符串测试我的函数,看看它是否给了我正确的数字。当我尝试运行测试时,我不断收到“Segmentation Fault”,它编译,但测试不起作用。 :(

这是我的头文件:

#ifndef COMMANDLINE_H
#define COMMANDLINE_H
#include "data.h"
#include <stdio.h>

struct point eye;

/* The variable listed above is a global variable */

void eye_flag(int arg_list, char *array[]);

#endif

这是我的实施文件:

#include <stdio.h>
#include "commandline.h"
#include "data.h"
#include "string.h"

/* Used global variables for struct point eye */

void eye_flag(int arg_list, char *array[])
{
   eye.x = 0.0;
   eye.y = 0.0;
   eye.z = -14.0;

   /* The values listed above for struct point eye are the default values. */

   for (int i = 0; i <= arg_list; i++)
   {
      if (strcmp(array[i], "-eye") == 0)
      {
         sscanf(array[i+1], "%lf", &eye.x);
         sscanf(array[i+2], "%lf", &eye.y);
         sscanf(array[i+3], "%lf", &eye.z);
      }
   }
}

以下是我的测试用例:

#include "commandline.h"
#include "checkit.h"
#include <stdio.h>

void eye_tests(void)
{
   char *arg_eye[6] = {"a.out", "sphere.in.txt", "-eye", "2.4", "3.5", "6.7"};
   eye_flag(6, arg_eye);

   checkit_double(eye.x, 2.4);
   checkit_double(eye.y, 3.5);
   checkit_double(eye.z, 6.7);

   char *arg_eye2[2] = {"a.out", "sphere.in.txt"};
   eye_flag(2, arg_eye2);

   checkit_double(eye.x, 0.0);
   checkit_double(eye.y, 0.0);
   checkit_double(eye.z, -14.0);
}

int main()
{
   eye_tests();

   return 0;
}

3 个答案:

答案 0 :(得分:3)

解决这个问题的绝对最简单的方法是在调试器中运行它。您可能甚至不需要学习如何单步执行代码或任何操作 - 只需启动,运行和读取该行。

如果您使用的是* nix系统:

  1. 使用-g标记编译代码。
  2. 加载为,例如gdb a.out
  3. 现在运行它已加载 - (gdb) run
  4. 做任何你需要的东西来重现段错误。
  5. btwhere应该为您提供堆栈跟踪 - 以及导致您出现问题的确切行。
  6. 我确信你可以从那里解决这个问题作为答案;但如果没有,知道确切的行将使非常更容易研究和解决。

答案 1 :(得分:2)

您的循环条件错误。它应该是i < arg_list 想想i == arg_list时会发生什么。

答案 2 :(得分:2)

错误在这里:

  for (int i = 0; i <= arg_list; i++)
  {            ///^^
      if (strcmp(array[i], "-eye") == 0)
      {
          sscanf(array[i+1], "%lf", &eye.x);
                   //^^^
          sscanf(array[i+2], "%lf", &eye.y);
          sscanf(array[i+3], "%lf", &eye.z);
      }
  }
    传递6,
  1. i <= arg_list错误,数组索引从0开始,最大值为5
  2. 当你从0迭代到5时,
  3. i+1, i+2,i+3会给你超出范围的索引。