编译器:gcc 4.5.2
终端:Xterm
作业系统:Linux(x86)
Ncurses 5.9
我正在编写一个文本编辑器,该文本编辑器使用ncurses以图形方式表示数组key_strokes[]
。它是一维的,因此我使用宏INDEX(y*maxx+x)
指向key_strokes
(key_strokes[INDEX]
)中的当前位置。 y
和x
是函数getyx(stdscr, y, x)
返回的终端中的当前坐标,而maxx
是函数getmaxyx(stdscr, maxy, maxx)
返回的每一行中可以存在的最大cols数量。该程序在我按退格键之前一直运行良好,由于某种原因,maxx
的值在到达下面的开关后会设置为零。当然,这会抛出INDEX
将其限制为仅数组的第一个“行”。
用户的按键被捕获为int key_strokes
。我用一个开关盒检查它是否是箭头键,退格键,F12等。INDEX
和maxx
定义为
#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。如果maxx
或maxy
恰好在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/