C--开辟输入n行3列二维数组的bug

今天在刷题的时候遇到里一个bug,试了很多办法都没有解决,最后用malloc开辟动态内存解决了这个问题,期间遇到了各种bug,最后来总结一下我解决问题的过程。


先把题目摆在这里

若有非零整数A、B、C,将其组成两个等式(A@B)#C = 24、A@(B#C) = 24,其中@和#为运算符号’+’、’-’、’*’、’/’、’%'之一,
同一符号可选择一次或多次,如果这两个等式至少有一个成立,则输出YES,否则输出NO。
输入:
第一行输入正整数N,表示有N组数据。(N<1000)
其后N行每行输入非零整数A、B、C(-1e5 <= A、B、C <= 1e5)
输出:
如果两个等式至少有一个成立,则输出YES,否则输出NO,每组数据的输出占一行。
样例输入 :
3
4 1 6
3 4 5
6 3 12
样例输出 :
YES NO YES
(注意,在该题中整数 / 整数,取结果的整数部分,例如1 / 4 = 0)

如何输入n行3列的数据呢?
我先是这样写的代码

int n=0;
scanf("%d", &n);
int arr[][3] = {
    0 };
for (int i = 0; i < 3; i++)
{
   
	arr[i] = (char*)malloc(sizeof(int)*3);//动态开辟列内存
}

这样我一运行傻了,我照题目的用例输入数据,输完3行后程序还在继续,我输了5行程序才停止,于是我调试了一下,发现
在这里插入图片描述
?????,为啥我的n值改变了,变成了我最后输入的一个数据5,所以循环一直执行下去了,直到我输入了5行。

随后我想到可能是n所在内存被5覆盖掉了,于是我又去内存中找找原因,果然!!!
在这里插入图片描述
看!我这里的n本来是3,直到我输完了第二行,n值所在的内存被5也就是arr[1][2]所覆盖掉了。于是我意识到了,这个二维数组在我没有定义行的时候,它默认只开辟了一行数据空间,也就是3个int类型空间的大小,这里我画个图就清楚了。
在这里插入图片描述
既然变量n和开辟的二维数组离的这么近,我何不让两个变量不在一块内存中,于是我就想到了把n作为全局变量写在程序中,因为全局变量开辟是在内存中的全局存储区,而局部变量的开辟是在内存中的栈上。这样不在一块开辟,何谈覆盖不覆盖而言!!!

于是我就这样干的,运行程序,竟然又是一个错误代码,我这个思路没有错啊,怎么回事。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值