【发布时间】:2019-11-10 22:26:52
【问题描述】:
首先,我用 ncurses 创建了两个窗口:一个用于发送,一个用于接收。基本上,一个用于编写命令,另一个用于打印命令。为了在接收窗口中写入输入,我做了一个小函数来连接已经在接收窗口中的字符串和用户编写的字符串(我认为问题就在那里)。
所以,当我运行代码时,程序失败并显示在wrefresh(winReception);行转储的分段错误代码
但奇怪的是,如果输入是 7 个或更少的字符,它可以工作,如果它是 8 个或更多,它会中断。
我正在使用 Code::Blocks
截图在这里:https://imgur.com/a/zEwBs1k
这里是一些代码:
//Global variables
WINDOW * winReception;
WINDOW * winTransmission;
char * command;
char mesg[] = "Enter a command";
//variable to stock the input in reception window
char *textinwindow = "";
//main
int main(int argc, char* argv[])
{
initscr();
/* WINDOW RECEPTION */
winReception = newwin(15, 0, 0, 0);
wrefresh(winReception);
/* WINDOW TRANSMISSION*/
winTransmission= newwin(8, 0, 15, 0);
wrefresh(winTransmission);
mvwprintw(winTransmission, 1, 2, mesg);
wgetstr(winTransmission, &command);
verifInput(&command);
free(textinwindow);
exit(0);
}
//concat function (where I think the bug is)
char* concat(char *s1, char *s2)
{
char *result = (char *) malloc(strlen(s1) + strlen(s2) + 1);
strcpy(result, s1);
strcat(result, "\n ");
strcat(result, s2);
return result;
}
//verifInput (where the program fails)
void verifInput (char* cmd)
{
/* WINDOW RECEPTION */
textinwindow = concat(textinwindow, cmd);
mvwprintw(winReception, 1, 2, textinwindow);
wrefresh(winReception);
/* WINDOW TRANSMISSION*/
touchwin(winTransmission);
wclear(winTransmission);
wrefresh(winTransmission); //Program fails here
mvwprintw(winTransmission, 1, 2, mesg);
wgetstr(winTransmission, &command);
verifInput(&command);
}
【问题讨论】:
-
在您的
concat()函数中,代码没有分配足够的内存。它需要两个字符串的大小(您可以这样做),再加上一个用于结尾的 NUL 字节(您可以这样做),但对于"\n "字符需要 另外两个。这是在分配数组的末尾写入,可能会导致问题。 -
还建议将
void verifInput(char *cmd);放在main上方的顶部,以便代码看到正确的原型。您是否尝试过打开最大编译器警告以查看这是否给您任何提示? -
@SteveFriedl 我尝试了你提到的一切,但它仍然给我同样的错误。但是,我不知道如何打开最大编译器警告。
-
啊哈。
wgetstr()电话可能是这里的罪魁祸首。您将指针的地址传递给缓冲区(而不是缓冲区本身),但那是随机内存。我很惊讶它没有死在那里。 -
@SteveFriedl 而不是
wgetstr(winTransmission, &command);我应该有wgetstr(winTransmission, command);?
标签: c codeblocks ncurses