变量的损失 - C

时间:2012-11-16 03:03:16

标签: c ncurses

  • 编译器:gcc 4.5.2
  • 终端:Xterm
  • 操作系统:Linux(x86)
  • Ncurses 5.9

我正在编写一个文本编辑器,它使用ncurses来图形化表示数组key_strokes[]。它是一维的,因此我使用宏INDEX(y*maxx+x)指向key_strokeskey_strokes[INDEX])中的当前位置。 yx是函数getyx(stdscr, y, x)返回的终端中的当前坐标,maxx是函数返回的每行中最大cols数量{ {1}}。该程序运行良好,直到我按退格键,由于某种原因,getmaxyx(stdscr, maxy, maxx)的值在到达下面的开关后设置为零。这当然会抛弃maxx,只将它限制在数组的第一个“行”。

用户的击键被捕获为INDEX。我使用一个开关盒来检查它是否是一个箭头键,退格键,F12等。int key_strokesINDEX被定义为,

maxx

注意我也在使用#define INDEX (y*maxx+x) unsigned int maxx = 0;

cbreak(); noecho(); keypad(stdscr, TRUE);

2 个答案:

答案 0 :(得分:1)

确定 key_strokes[]是否以空终止?

'如果不是,for循环会将内存中的所有内容复制到上一个单元格,直到达到0.如果maxxmaxy正好在0值,它们将被设置为0.

想象一下以下布局:

| key_strokes[0] | key_strokes[...] |   key_strokes[n] | maxy | maxx | some_other_var |
|            'v' |              'i' | non-null garbage |   23 |   80 |           '\0' |

在'i'之后按下后退后,它将是:

| key_strokes[0] | key_strokes[...] |   key_strokes[n] | maxy | maxx | some_other_var |
|            'v' | non-null garbage |               23 |   80 | '\0' |           '\0' |

这也可以解释为什么当maxy被声明为const时,maxx被设置为0(GCC不会将const存储在内存中的同一位置)。

为确保key_strokes[]以空值终止,我建议您将其添加到初始化部分:

memset(key_strokes, 0, sizeof(char) * size_of_key_strokes_array);

答案 1 :(得分:0)

我看不到x和y的类型(即有符号或无符号),但是你计算(无符号整数的y倍和添加x)似乎很有趣。这个表达的类型可能是什么?可能它取决于y的类型。检查条件是否大于或等于零是否合理? (无符号值总是gte为零......)