我在C项目中看到一些非常奇怪的行为 - https://github.com/ryu577/base/blob/master/numerical/c/NumericalRecipiesCode/src/ch05/tst5.c
在第77行,我在" testFn"上运行了一个例程。这是在第13行,我也包括在下面。我通过传递一个指向函数的指针来做到这一点。
float testFn(float x)
{
return x*x;
}
接下来,在第87行,我只是尝试根据C中的数字配方的样板例程初始化一个浮点数组:
float *c1; c1 = vector(0, n1);
" vector"功能很简单,包括在这里:
float *vector(long nl, long nh)
/* allocate a float vector with subscript range v[nl..nh] */
{
float *v;
v=(float *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(float)));
if (!v) nrerror("allocation failure in vector()");
return v-nl+NR_END;
}
现在,当我在" vector"中打印条目时(float array - c1),这就是我得到的 -
12.00 12.00 12.00 0.00 0.00
不知何故,它决定在前3个位置投入12个。但真正有趣的是,这些数字取决于我如何定义testFn。例如,如果我将其定义为:
float testFn(float x)
{
return x*x*x;
}
然后我得到c1的条目:
112.00 110.04 109.04 108.53 0.00
但问题是矢量的创建和初始化与testFn完全没有关系。那么,它如何以这种方式影响其价值呢?它是否与某些内存块无关,而这些内存块未被释放且值会溢出到新数组中?
答案 0 :(得分:3)
malloc()
不会初始化数组的内容。这意味着在这个块中可以是任何东西 - 浮点数,整数或完全垃圾,在你的情况下它是从前一个操作留下的一些数值。在函数内部声明数组时也会发生这种情况。
您通常不希望浪费计算时间来清除每个分配的块,因为在使用它们时无论如何都会覆盖它们。要获得所需的行为,请在分配数组后使用循环初始化数组。
最后,请注意,您的程序可能会通过将未初始化的内存读取为float
来调用未定义的行为。有关详细说明,请参阅问题read before write is undefined with malloced memory?。