论C++中某些神奇的现象

本蒟蒻接触C++不久,在此分享一下学习过程中遇到的某些神奇现象....

1.越界赋值

这个现象来自于以前打的一个深搜程序:

#include<bits/stdc++.h>
using namespace std;
const int dx[9]={0,-1,-1,-1,0,0,1,1,1};
const int dy[9]={0,-1,0,1,-1,1,-1,0,1};
int a[15][15],n,tot=0;
/*void dfs(int x,int y)
{
	if (x==1&&y==n)
	{
		tot++; return;
	}
	for (int i=1;i<=8;i++)
	{
		int x0=x+dx[i],y0=y+dy[i];
		if (a[x0][y0]==0)
		{
			a[x0][y0]=1;
			dfs(x0,y0);
			a[x0][y0]=0;
		}
	}
	return;
}*/
int main()
{
	for (int i=0;i<=15;i++)
	 for (int j=0;j<=15;j++) a[i][j]=1;
	cin>>n;
	for (int i=1;i<=n;i++)
	 for (int j=1;j<=n;j++) cin>>a[i][j];
	cout<<tot<<endl;
	//dfs(1,1);
	//cout<<tot<<endl;
	return 0;
}
 

原题如下:


DFS部分不必看,重点是在主程序。

我首先将整个矩阵连带边界赋成了1防止搜索时越界,但在我第一次调试时发现了一个问题,就是一个没有路径的迷宫在此程序中输出了1.

我感到很疑惑,就多次尝试,发现根本问题是tot这个计数器在进入DFS部分前就变成了1.

那么问题来了,我在定义部分清清楚楚写明了tot=0,为什么会突然变化呢?

后来我找到了问题的根源。

看到那个15*15的数组了吗?没错,就是它。

可以看到,在主程序给数组赋值时,从0循环到了15,而C++中数组是从0开始的,若定义成[15][15],实际上只从0~14,这样赋值时就越界了。

那么越界的那个1去哪了呢?赋给相邻的变量n和tot了,而由于n在之后又被输入一次,那么“受害者”只有tot这个变量。

所以,我们有:

一个变量(假设为A)附近定义的变量(假设为B)被赋值的时候越界导致A变量的值被改变。

以上就是第一个现象:越界赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值