Linux,C,ncurses:由printw引起的seg错误

时间:2012-03-24 02:42:14

标签: c linux segmentation-fault ncurses

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 ()

2 个答案:

答案 0 :(得分:4)

您是否忘记致电initscr()?

答案 1 :(得分:2)

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

如果这不是一个选项,请检查您的索引是否有一个错误,然后尝试注释掉(整个)程序的某些部分,直到您到达仍然崩溃的最小片段为止;如果你想帮助调试那么发帖。

另外,因为我无法自助,所以你只需要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);
    }
}