【问题标题】:Segmentation fault when reading the user input from STDIN从 STDIN 读取用户输入时出现分段错误
【发布时间】:2013-11-04 18:32:41
【问题描述】:

我正在尝试使用以下程序从文件描述符“0”(STDIN)读取用户输入。之前,它没有问题,但是在程序的其他部分进行了一些更改之后,它在读取输入时给了我一个分段错误。我还删除了“FD_CLR(0, &readfds)”以查看它是否有效,但它没有。你能检查一下问题出在哪里吗?

        char *userInput;
        FD_ZERO(&masterfds);
        FD_SET(0, &masterfds);
        FD_SET(udp_con, &masterfds);
        maxfds = udp_con;

        while(exit == false)
        {               
            readfds = masterfds;

            selectFunc = select(maxfds+1, &readfds, NULL, NULL, &tv);
            if(selectFunc < 0)
            {
                message("error in select");
                exit = true;
            }
            else if(selectFunc == 0) //If there is a timeout
            {

            }
            else //If a file descriptor is activated
            {
                if(FD_ISSET(udp_con, &readfds)) //If there is an activity on udp_con
                {
                    /*read the udp_con via recvfrom function */
                } 
                if(FD_ISSET(0, &readfds)) //If There is an input from keyboard
                {

                    /* When it reaches to this part, the program shows a "segmentation fault" error */
                    fgets(userInput, sizeof(userInput), stdin);
                    int len = strlen(userInput) - 1;
                    if (userInput[len] == '\n')
                    {
                        userInput[len] = '\0';
                    }
                    string str = userInput;
                    cout<<"The user said: "<<str<<endl;                         
                    commandDetector(str);
                    FD_CLR(0, &readfds);
                }                   
            }
        }

【问题讨论】:

  • userInput 是如何声明的,在到达这部分代码之前是否对其进行了处理?
  • @MarkkuK。抱歉,我忘记添加 userInput 声明语句。我刚刚编辑了我的第一篇文章并将其添加到代码的开头。

标签: c select network-programming user-input stdin


【解决方案1】:

您将userInput 声明为char *。这为您提供了一个指向您几乎可以肯定不拥有且无法写入的随机位置的指针。如果这曾经奏效,那是纯粹的(坏)运气。

解决此问题的最简单方法是将userInput 声明为数组,例如:

char userInput[1024];.

这将使 userInput 成为一个包含 1024 个字符的数组,您可以根据需要对其进行修改,特别是可以传递给 fgets 以供其写入。

另一种方法是使用malloc 来获取一些内存:

char *userinput = malloc(1024);

如果这样做,您还必须将调用更改为fgets,因为sizeof(userInput) 将产生指针的大小(通常为4 或8),而不是它指向的内存大小。所以像:

fgets(userInput, 1024, stdin);

此外,如果您从 malloc 获取内存,您应该在完成后调用 free,所以:

free(userInput);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    相关资源
    最近更新 更多