【问题标题】:Linux C Ncurses issueLinux C Ncurses 问题
【发布时间】: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 会进行一些指针检查,但可能会错过一些有用的检查。

标签: c linux null ncurses


【解决方案1】:

实际上(在这个问题中没有样本 MCVE 进行测试),ncurses 确实检查了这个空指针,并且预计会忽略 printw 将在 wmove 部分之后调用。

要查看此内容,请按照源代码:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多