【发布时间】:2015-06-06 17:59:36
【问题描述】:
请在下面查看我的代码。我很困惑为什么我的全局变量“magicnunmber”的值在第一次“迭代”之后会发生变化,尽管我没有在代码中的任何地方更改它的值。
#include <stdio.h>
float m[4][4] = { {0,0.5,1,0},{0.33,0,0,0.5},{0.33,0,0,0.5},{0.33,0.5,0,0} };
float v[4][1] = {{0.25},{0.25},{0.25},{0.25}};
float vdash[4][1];
int i =0, j=0;
int r1,c1,r2,c2,k;
float magicnumber = 0.01;
int iteration = 0;
int main(void)
{
r1 = c1 = r2 = 4;
c2 = 1;
//while(1)
while(iteration < 5)
{
printf("magicnumber==[%f]\n",magicnumber);
//magicnumber = 0.01;
iteration++;
printf("\n---------------------------------------------------------------------------------------------------------------------\n");
for(i=0;i<r1;i++)
{
for(j=0;j<c2;j++)
{
vdash[i][j] = 0;
for(k=0;k<c1;k++)
{
vdash[i][j] = vdash[i][j] + (m[i][k] * v[k][j]);
}
}
}
if(myfun(vdash,v)==0)
{
break;
}
else
{
printf("\n");
for(i=0;i<r1;i++)
{
v[i][1] = vdash[i][1];
}
}
}
return 0;
}
int myfun(float* vdash, float* v)
{
float delta = 0;
for(i=0;i<r1;i++)
{
delta = (*(vdash+i) - *(v+i));
(delta < 0)?(delta = delta*-1):delta;
if( delta > magicnumber)
{
return 1;
}
}
return 0;
}
我的输出
magicnumber==[0.010000]
---------------------------------------------------------------------------------------------------------------------
magicnumber==[0.000000]
---------------------------------------------------------------------------------------------------------------------
magicnumber==[0.000000]
---------------------------------------------------------------------------------------------------------------------
magicnumber==[0.000000]
---------------------------------------------------------------------------------------------------------------------
magicnumber==[0.000000]
---------------------------------------------------------------------------------------------------------------------
我已经在gdb上试过了,但是我只能看到进入新的迭代时这个值变成了一个很小的数字。
1: magicnumber = 0.00999999978
1: magicnumber = 0.00999999978
1: magicnumber = 5.60519386e-45
如果我从不给它分配任何东西,magicnumber 怎么会改变?
【问题讨论】:
-
当转换为
float*并传递给函数myfun时,编译器不知道数组vdash和数组v的维度。由于这些数组是全局的,因此您最好不要将它们传递给函数。也就是说,您应该尽可能避免使用全局变量(在您给定的代码中几乎是everywhere)。顺便说一句,我希望编译器会在包含myfun(vdash,v)的行上警告您有关尺寸问题。不是吗??? -
因为你在 myfun() 中破坏了你的内存,由于函数参数不匹配,这不应该在没有警告/错误的情况下编译。
标签: c pointers floating-point stack global-variables