1

示例代码:

float** a;  
a = (float**) malloc(numNodes * sizeof(float*));  
for(int i=0; i<`numNodes`; i++)  
{  
    a[i] = (float*)malloc((numNodes-1) * sizeof(float));  
}

我在上面创建了一个动态二维数组。在填充之前,我注意到数组中的每个块都已经保存了这个值:-431602080.000000 而不是 NULL。为什么是这样?
在某些情况下,并非数组中的所有空格都被使用。
所以,我的查询很简单,是否有一种优雅的方法来检查每个块是否具有此默认值或用户定义的值?

提前致谢。

4

5 回答 5

2

分配的内存内容malloc(以及分配在堆栈上的变量)是undefined,所以它很可能是任何东西。通常你会得到用零填充的空间(因为操作系统会清除其他进程使用的内存页面)或之前使用这些内存页面的残留物(如果内存页面属于你的进程,这通常是这种情况),但这是幕后发生的事情,C 标准不提供任何保证。

所以,一般来说没有“默认值”,也没有办法检查你的记忆是否已经改变;但是,您可以使用您确定不会用作“真实数据”的魔法值来初始化您使用的内存块,但这只是您的应用程序内部的约定。

幸运的是,对于浮点变量,您可以使用几个神奇的值,例如 quiet NaN;一般来说,您可以使用中NAN定义的宏<math.h>将 a 设置float为 NaN。

顺便说一句,您不应该读取未初始化float的 s 和doubles,因为它们存储在 (IEEE 754) 中的通常格式包含一些魔法值(如信号 NaN),这些值在读取时会引发算术异常,所以如果您未初始化内存恰好包含这样的位模式,您的应用程序可能会崩溃。

于 2010-12-31T12:27:22.947 回答
1

扩展 Matteo Italia 的好答案:

单个数组的初始化代码如下所示:

float* row;

row = malloc( numNodes*sizeof(float) );
for (int i=0; i<numNodes; ++i) {
    row[i] = nanf(); // set a Not-a-Number magic value of type float
}

(我会让你为你的多维数组改变这个)

然后某处:

float value = ...; // read the array
if (isnan(value)) {
    // not initialized
} else {
    // initialized - do something with this
}

重要的是要记住:NaN == NaN将产生 false,因此最好使用isnan(),而不是==测试该值的存在。

于 2010-12-31T12:54:18.223 回答
1

C 运行时不需要初始化您自己没有初始化的任何内存,并且它们保存的值本质上是上次使用该内存时留下的随机垃圾。您必须先将它们全部显式设置为 NULL 或使用 calloc。

于 2010-12-31T12:20:11.677 回答
0

在 C 中,自动变量不会自动初始化。如果您想要的话,您需要将变量显式设置为 0。

这同样适用于malloc它不会初始化它分配的堆上的空间。calloc如果要初始化它,可以使用:

a = malloc( numNodes*sizeof(float*) ); // no need to initialize this
for ... {
  a[i] = calloc( numNodes-1, sizeof(float) );
}
于 2010-12-31T12:17:39.953 回答
0

在填充之前,我注意到数组中的每个块都已经保存了这个值:-431602080.000000 而不是 NULL。为什么是这样?

malloc()不会初始化它分配的内存。calloc()如果要0初始化,则需要使用

void *calloc(size_t nelem, size_t elsize);

calloc()函数为元素数组分配未使用的空间,nelem每个元素的字节大小为elsize。该空间应初始化为所有位 0。

于 2010-12-31T12:20:19.830 回答