【问题标题】:segmentation fault C finite state machine分段错误 C 有限状态机
【发布时间】:2012-09-07 00:13:18
【问题描述】:

我对 C 编程比较陌生,我正在尝试制作一个分隔符检查器,但由于某种原因,每次我运行我的代码并获取我的输入来检查分隔符时,它都有一个 分段错误(核心转储) 错误。

下面是主程序的代码:

int
main (void)
{
  char* mystring;
  printf ("Please enter a string\n");
  gets(mystring);
  if (fsm(mystring))
    {
      printf ("All matched");
    }
}

它似乎永远不会进入子程序fsm,因为我在子程序的开头输入了printf,它永远不会出现。如果我将printf 放在子程序行之前的主程序中,它确实会询问我的输入并将其打印出来。

这是我的原型:

boolean fsm(char[]);

如果有帮助的话,这里是子程序的开头:

boolean fsm (char mystring[])
{
  printf("here\n");
  int counter = -1;
  int state = 0;
  c_stack top;
  c_init_stack (&top);
  while (1)
    {
      switch (state)
    {
    case 0:
      counter = counter + 1;
      if (is_open (*mystring))
        state = 1;
      else if (is_close (*mystring))
        state = 2;
      else if (mystring = '\0')
        state = 3;
      else
        state = 4;
      break;

【问题讨论】:

  • 1) else if (mystring == '\0')(我猜函数参数指向一个字符串字面量?) 2) char* mystring; printf ("Please enter a string\n"); gets(mystring); mystring 指向无处。 3) 不要使用gets()

标签: c segmentation-fault switch-statement fault fsm


【解决方案1】:

您正在尝试读取未初始化的char*。仅仅声明 char *mystring 并没有给你一个可以使用的字符串:你需要为字符串分配空间。

要么:

char *mystring = malloc(MAX_STRING_LENGTH);

或者:

char mystring[MAX_STRING_LENGTH];

一旦有了缓冲区,就使用fgets 而不是getsfgets 允许您指定读取字符数的上限,因此 fgets 以及 MAX_STRING_LEN 之类的内容您将只能接受缓冲区所容纳的数据。

事实上,由于 C 不初始化自动(局部)变量,mystring 有一个未定义的值。它可以指向内存的任何随机部分。当您尝试使用此内存位置gets 时,您正在尝试写入不属于您的内存。

最后,这个带有单个 =: else if (mystring = '\0') 的条件是一个赋值,而不是一个相等测试。

【讨论】:

    猜你喜欢
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多