分段故障C有限状态机

tkd*_*_aj 1 c fsm segmentation-fault switch-statement fault

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

以下是主程序的代码:

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

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

这是我的原型:

boolean fsm(char[]);
Run Code Online (Sandbox Code Playgroud)

如果有任何帮助,这是子程序的开头:

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;
Run Code Online (Sandbox Code Playgroud)

pb2*_*b2q 6

你试图读到一个未初始化的char*.只是声明char *mystring没有给你一个字符串可以使用:你需要为字符串分配空间.

或者:

char *mystring = malloc(MAX_STRING_LENGTH);
Run Code Online (Sandbox Code Playgroud)

要么:

char mystring[MAX_STRING_LENGTH];
Run Code Online (Sandbox Code Playgroud)

一旦有了缓冲区,请使用fgets而不是gets.fgets允许您指定的上界上的字符数读取,因此fgets伴随着像MAX_STRING_LEN你就可以只接受尽可能多的数据您的缓冲区将举行.

实际上,由于C不初始化自动(本地)变量,mystring因此具有未定义的值.它可以指向任何随机的内存部分.当您尝试gets使用此内存位置时,您尝试写入不属于您的内存.

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