Unhandled exception at XXXX (ntdll.dll) in XXXX.exe: XXXX: 堆已损坏。 (parameters:XXXX).

说一下今天编程时遇到的一个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’ 为止。
所以说,这个函数能够计算数组长度的情景,也仅限于字符数组而已,破案了!!!!
果然,又是一个越界导致的问题。

发布了58 篇原创文章 · 获赞 3 · 访问量 2175

猜你喜欢

转载自blog.csdn.net/weixin_43936250/article/details/103996114