说一下今天编程时遇到的一个bug。
在编写C语言:机器人的运动范围这道题目时,一开始特别顺畅,后来在move_range函数中给visited数组赋初值时,我想使用另外一种方法去替换。
原先的赋值方法:
memset(visited, 0, (rows * cols) * sizeof(int));
修改后的赋值方法:
memset(visited, 0, strlen(visited));
改完之后重新运行(仅测试test1(),其余三个测试函数先注释掉),发现输出结果为空。
开始Debugging,弹出如下错误:
单击Continue:
继续单击Continue,错误在上述两个窗口之间来回反复。所以问题就出在memset函数上。
为了检验,我在初始化visited数组后设置了两个变量,来表示strlen(visited)
和(rows*cols)*sizeof(int)
的区别。
修改后的move_range函数:
int move_range(int k, int rows, int cols) {
if ((k < 0) || (rows <= 0) || (cols <= 0))
return 0;
int *visited = (int *)malloc((rows * cols) * sizeof(int));
// memset(visited, 0, (rows * cols) * sizeof(int));
int a = strlen(visited);
int b = (rows * cols) * sizeof(int);
printf("%d\n", a);
printf("%d\n", b);
// memset(visited, 0, strlen(visited));
int count = move_range_count(k, 0, 0, rows, cols, visited);
free(visited);
return count;
}
运行结果:
将初始化函数注释掉,可以发现strlen(visited) > (rows*cols)*sizeof(int)
,visited中只有100比特,却想在memset中对visited的110比特赋值,当然会出错啦!!!
然后我查了strlen
函数的用法:
计算字符串长度,计算到字符串结束符 ‘\0’ 为止。
所以说,这个函数能够计算数组长度的情景,也仅限于字符数组而已,破案了!!!!
果然,又是一个越界导致的问题。