编译器: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是函数getmaxyx(stdscr, maxy, maxx)返回的每一行中可以存在的最大cols数量。该程序在我按退格键之前一直运行良好,由于某种原因,maxx的值在到达下面的开关后会设置为零。当然,这会抛出INDEX将其限制为仅数组的第一个“行”。

用户的按键被捕获为int key_strokes。我用一个开关盒检查它是否是箭头键,退格键,F12等。INDEXmaxx定义为

#define INDEX (y*maxx+x)
unsigned int maxx = 0;


注意我也在使用cbreak(); noecho(); keypad(stdscr, TRUE);

case KEY_BACKSPACE:
if (INDEX >= 0)
{
   for(i = INDEX; key_strokes[i] != '\0'; i++) {
   key_strokes[i] = key_strokes[i+1];
   }

   if (total_count > 0) {
   total_count--;
   }

   delch();
   if (x == 0) {
   move(y-1, maxx-1);
   }
   else {
   move(y, x-1);
   } refresh();
}
break;

最佳答案

您确定key_strokes[]为null终止吗?

因为如果不是,那么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[]以空值结尾,建议您将其添加到init部分:

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

关于c - 变量损失值-C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13409755/

10-11 18:05