#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语言真的容易搞出漏洞,大家一定要谨慎~~
举出这个例子,以便其他同学碰到同样的问题少碰一些钉子。纯属个人理解,如若有误欢迎指正。