【C语言】未修改的变量的值却发现变量的值改变的思考

 

#include<stdio.h>
struct Ploy
{
    int exp;//指数
    double cof;//系数
}ploy[1001];
double ans[2002];
int main()
{
    int n1,n2;//第一个表达式非0项数n1,第二个表达式的非0项数n2
    int tmpExp,tmpCof,number=0;

    scanf("%d",&n1);
    for(int i=0;i<n1;i++)
    {
        scanf("%d %lf",&ploy[i].exp,&ploy[i].cof);
    }
    scanf("%d",&n2);
    for(int i=0;i<n2;i++)
    {   
        scanf("%d %lf",&tmpExp,&tmpCof);
        for(int j =0;j<n1;j++)
            ans[tmpExp+ploy[j].exp] += ploy[j].cof*tmpCof;
    }

   在上述代码中第二个for循环前,对n2进行了赋值操作,然后在for循环输入数据的时候进入了死循环,检查了n2的值发现在第一轮输入后n2的值变为了1141214一个很大的数字。for循环中没有任何赋值操作为什么会对n2产生改变呢?

   仔细检查后发现声明的时候tmpCof这个变量用int型声明却在scanf时候用%lf接受。我的机子中c语言int占4字节,double占8字节。发生这个错误的原因见下图

tmpCof在声明时候分配了四个字节(图中一个蓝方块代表一个字节),n2也是int型同样分配了四个字节。这两个变量恰巧被分配在连续的空间上。但是在scanf时候tmpCof接受了八个字节的内容,导致n2原来的值被覆盖掉。所以就产生了循环。

初值如下:

进行了scanf语句后

n2被异常覆盖,程序进入死循环。

 

我重启了一下编译器,稍微变动了一下代码顺序,该问题已经不能复现。证明这个tmpCof和n2没有再连续分配到一起。但是tmpCof这个输入还会覆盖别的变量,造成程序输出的错误。从这个例子中可以看出,某些变量如果出现不合逻辑的数字,一般要考虑越界的情况,并且不要死磕该变量,去看看其他变量是否有越界错误。还有就是C语言真的容易搞出漏洞,大家一定要谨慎~~

举出这个例子,以便其他同学碰到同样的问题少碰一些钉子。纯属个人理解,如若有误欢迎指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值