我用 C 语言编写了这个程序,故意添加了一个错误。
程序计算用户输入的 5 个数字的总和,并将结果显示在屏幕上。
我用“gcc -Wall -Wextra -Werror -ansi -pedantic -g”编译它并且工作正常。
但是有一个错误。
在循环的最后一次重复中,程序计算 a[N],该值未定义!
我想知道如何使用 GDB 发现此类错误
当我使用“设置检查范围”时,我收到此消息“警告:当前范围检查设置与语言不匹配。”但什么也没发生...
这是要调试的代码:
#define N 5
#include <stdio.h>
void read(float*);
int main(void) {
float a[N], s;
int i;
printf("Enter %d numbers: ", N);
read(a);
i = -1;
s = 0;
while (i != N) {
i = i + 1;
s = s+a[i];
}
printf("The sum is : %.2f \n", s);
return 0;
}
void read(float*a) {
int n = 0;
while (n!=N) {
scanf("%f",&a[n]);
n++;
}
}
最佳答案
我认为这是你的问题:
while (i != N) {
i = i + 1;
s = s+a[i];
}
N
定义为5
,所以当 i
为 4,则条件为真。 i
然后增加到 5,并且 s += a[i];
被执行。只需使用 for
改为循环,或使用 do {} while
:
for (i=0;i<N;++i)
s += a[i];
//or
i = 0;
do {
s += a[i];
} while (++i != N);
无论哪种方式。就我个人而言,我发现for
循环更具可读性
回答您的问题(使用 gdb):
- 您已使用 -g 标志进行编译,因此运行 `gdb generated_file_name
- 在 gdb 中,在
while
设置断点循环(b <line-nr> [condition]
) - 启动程序 (
run
) - 使用
step
或next
单步执行代码 - 使用
p i
检查i
的值每次您点击while
条件,以及每次使用i
作为偏移量 (a[i]
)
了解更多详情,docs for gdb可用。这需要一些时间,但非常值得。 gdb 是一个优秀的调试器
关于c - 如何使用GDB检测C程序中的 "out of bound error"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27064935/