浅析错误 Run-Time Check Failure #2 - Stack around the variable ‘a‘ was corrupted

浅析错误 Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted

问题叙述

最近在写循环嵌套的时候老是报错:Run-Time Check Failure #2 - Stack around the variable ‘a’ was corrupted

百思不得其解,循环没有问题,网上查找错误,都说是内存越界造成的,于是各种扩大数组大小,仍然报错。
在这里插入图片描述
以下是测试程序:

#include <iostream>
using namespace std;
#define MAX_AXES  4

int main()
{

	int axispos[MAX_AXES];
	int axisvel[MAX_AXES];
	int time[10] = { 0 };
	for (int i = 0; i < MAX_AXES; i++)
	{
		axispos[i] = i;
		axisvel[i] = i;
	}

	int a[10 * (MAX_AXES * 2 + 1)];
	for (int i = 0; i < 10; i++)
	{
		a[i*(2 * MAX_AXES + 1)] = time[i];
		cout << a[i*(2 * MAX_AXES + 1)] << "|";
		for (int j = 0; j < MAX_AXES; j++)
		{
			a[i*(2 * MAX_AXES + 1)+2*j-1] = axispos[j];
			a[i*(2 * MAX_AXES + 1) + 2 * j] = axisvel[j];
			cout << a[i*(2 * MAX_AXES + 1) + 2 * j - 1] << "|" << a[i*(2 * MAX_AXES + 1) + 2 * j] << "|";
		}
		cout << endl;
	}

	return 0;
}


在老王大腿的指导下,找到了问题所在。
在第2层循环中,有一句a[i*(2 * MAX_AXES + 1)+2*j-1] = axispos[j];,当i,j都为0的时候,a的索引变成了-1,于是引起数组越界问题。

解决方案

把循环从0开始换成从1开始

#include <iostream>
using namespace std;
#define MAX_AXES  4

int main()
{
	int axispos[MAX_AXES];
	int axisvel[MAX_AXES];
	int time[20] = { 0 };
	for (int i = 0; i < MAX_AXES; i++)
	{
		axispos[i] = i;
		axisvel[i] = i;
	}

	int a[10 * (MAX_AXES * 2 + 1)];
	for (int i = 0; i < 10; i++)
	{
		a[i*(2 * MAX_AXES + 1)] = time[i];
		cout << a[i*(2 * MAX_AXES + 1)] << "|";
		for (int j = 1; j <= MAX_AXES; j++) ///
		{
			a[i*(2 * MAX_AXES + 1)+2*j-1] = axispos[j-1];
			a[i*(2 * MAX_AXES + 1) + 2 * j] = axisvel[j-1];
			cout << a[i*(2 * MAX_AXES + 1) + 2 * j - 1] << "|" << a[i*(2 * MAX_AXES + 1) + 2 * j] << "|";
		}
		cout << endl;
	}

	return 0;
}

为什么各种尝试都没有发现?原因在于形成了定式思维,一说超限首先想到的是上界超限,于是开始钻牛角尖………………

结论

  • 定式思维要不得!!!!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值