【发布时间】:2020-04-11 01:47:47
【问题描述】:
我在使用 C 语言的 Ncurses 时遇到了一个奇怪的问题,我似乎无法在任何地方找到文档,也无法在网络上找到。也许我没有使用正确的搜索字词?
问题来了:
我有几个窗口和面板以及大量代码。这一切都完美无缺,直到发生这种情况:
mvwprintw(windowptr[i], y, x, NULL); <-- That NULL value is what sets off the bomb
我希望一个 NULL 字符串会简单地打印一个长度为 0 的字符串,但事实并非如此。实际发生的是它破坏了我所有的窗口/面板。它似乎以某种方式删除了所有以前写入的字符,并禁止在除当前窗口/面板之外的所有窗口/面板上显示新字符。当前窗口/面板不会被空白,但不能打印新字符。
这是一个错误吗? ...或者可能是未记录的功能?
这是我的 Ncurses 版本:
$ dpkg -l | grep -i ncurse
ii libncurses5:amd64 6.0+20160213-1ubuntu1 amd64 shared libraries for terminal handling
ii libncurses5:i386 6.0+20160213-1ubuntu1 i386 shared libraries for terminal handling
ii libncurses5-dev:amd64 6.0+20160213-1ubuntu1 amd64 developer's libraries for ncurses
ii libncursesw5:amd64 6.0+20160213-1ubuntu1 amd64 shared libraries for terminal handling (wide character support)
ii libncursesw5:i386 6.0+20160213-1ubuntu1 i386 shared libraries for terminal handling (wide character support)
ii mtr-tiny 0.86-1ubuntu0.1 amd64 Full screen ncurses traceroute tool
ii ncurses-base 6.0+20160213-1ubuntu1 all basic terminal type definitions
ii ncurses-bin 6.0+20160213-1ubuntu1 amd64 terminal-related programs and man pages
ii ncurses-term 6.0+20160213-1ubuntu1 all additional terminal type definitions
【问题讨论】:
-
另见
mvwprintw(3)man page。在这种情况下,您可能应该使用空格式字符串。考虑一下,你不能printf(NULL),所以你不应该mvwprintw(..., NULL)。mvwprintw(..., "")应该避开地雷。 (我找不到关于printf(NULL)的问答供您引用)。 -
“”是否以 NULL 结尾的字符串!= NULL?换一种说法:
"" == NULL -
对不起,我应该指定我使用 GNU C。我编辑了帖子以反映这一点。
-
"" == NULL否。""是指向只读位置的指针,该位置具有包含零的单个字节。NULL是 0。它们不同。 -
这是未定义的行为(例如this comment)。无论如何,ncurses 会进行一些指针检查,但可能会错过一些有用的检查。