C无关的函数似乎影响简单的数组初始化

时间:2016-05-04 07:53:38

标签: c

我在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完全没有关系。那么,它如何以这种方式影响其价值呢?它是否与某些内存块无关,而这些内存块未被释放且值会溢出到新数组中?

1 个答案:

答案 0 :(得分:3)

malloc() 不会初始化数组的内容。这意味着在这个块中可以是任何东西 - 浮点数,整数或完全垃圾,在你的情况下它是从前一个操作留下的一些数值。在函数内部声明数组时也会发生这种情况。

您通常不希望浪费计算时间来清除每个分配的块,因为在使用它们时无论如何都会覆盖它们。要获得所需的行为,请在分配数组后使用循环初始化数组。

最后,请注意,您的程序可能会通过将未初始化的内存读取为float来调用未定义的行为。有关详细说明,请参阅问题read before write is undefined with malloced memory?