【问题标题】:Linux, C, ncurses: seg fault caused by printwLinux,C,ncurses:由打印引起的段错误
【发布时间】:2012-03-24 02:42:14
【问题描述】:

printw() 有什么原因会导致分段错误吗?

没有它的代码很好;被它打破了。它似乎没有做任何深奥的事情,所以我什至不知道如何开始理解这里出了什么问题。

提前感谢您的任何建议!

#include <ncurses.h>
...
initscr();
noecho();
cbreak();
...
    void draw_court()
    {
        move(TOP_ROW-1, LEFT_COL+4);
        printw("LIVES REMAINING: 3");

        int i;
        for (i = 0; i < RIGHT_COL; i++)
            mvaddch(TOP_ROW, LEFT_COL+i, H_LINE);

        for (i = 1; i < BOT_ROW-TOP_ROW; i++)
            mvaddch(TOP_ROW+i, LEFT_COL, V_LINE);

        for (i = 0; i < RIGHT_COL; i++)
            mvaddch(BOT_ROW, LEFT_COL+i, H_LINE);
    }

ETA:来自 gdb 的堆栈跟踪:

#0 0xb778a139 in _nc_printf_string () from /lib/libncurses.so.5
#1 0xb7785e04 in vwprintw () from /lib/libncurses.so.5
#2 0xb7785f63 in printw () from /lib/libncruses.so.5
#3 0x08048f23 in draw_court ()
#4 0x080489f4 in set_up ()
#5 0x0804890a in main ()

【问题讨论】:

  • TOP_ROW-1 是正确的计算,还是应该是 TOP_ROW+1?我在想越界错误。
  • TOP_ROW 实际上定义为 5 - 抱歉,我知道这有点令人困惑。
  • 我会尝试在 valgrind 下运行你的程序来检查内存错误。
  • 应该i &lt; RIGHT_COLi &lt; RIGHT_COL - LEFT_COL 吗?或者你定义RIGHT_COL 是绝对的,而BOT_ROW 是相对的?
  • 你能发布完整的代码吗?因为有时,打印会隐藏其他地方的问题

标签: c linux segmentation-fault ncurses


【解决方案1】:

你忘记打电话给initscr()了吗?

【讨论】:

  • initscr() 在其他地方被调用。如果我用printw() 注释掉该行,代码就会运行。
  • 我已经对其进行了编辑,以显示它在调用此方法之前进行的初始化调用。
  • 将此作为解决方案,因为问题原来是我在 initscr() 之前调用了 draw_court()。我不认为这是一个问题,因为没有那一行代码它可以正常工作。奇怪的是 mvaddch 可以在 initscr() 之前工作,但不能在 printw() 之前工作。
【解决方案2】:

您最好的选择可能是在gdb 或其他调试器下运行代码,这样您就可以确切地看到它在做什么。

如果这不是一个选项,请检查您的索引是否存在错误,然后尝试注释掉(整个)程序的某些部分,直到您到达仍然崩溃的最小 sn-p;如果您需要帮助调试,请发布。

另外,因为我忍不住,你只需要 2 个循环就可以画一个盒子。 :-)

void draw_box()
{
    move(TOP_ROW-1, LEFT_COL+4);
    printw("LIVES REMAINING: 3");

    int i;
    for (i = 0; i < RIGHT_COL; i++) {  // should the limit be RIGHT_COL - LEFT_COL ?
        mvaddch(TOP_ROW, LEFT_COL+i, H_LINE);
        mvaddch(BOT_ROW, LEFT_COL+i, H_LINE);
    }
    for (i = 1; i < BOT_ROW-TOP_ROW; i++) {
        mvaddch(TOP_ROW+i, LEFT_COL, V_LINE);
        mvaddch(TOP_ROW+i, RIGHT_COL, V_LINE);
    }
}

【讨论】:

  • 哦,我喜欢这两个循环。 :) 我将使用 gdb 的堆栈跟踪来编辑我的帖子。
猜你喜欢
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
相关资源
最近更新 更多