示例代码:
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。这是为什么? 在某些情况下,不会使用阵列中的所有空间 所以,我的查询很简单,是否有一种优雅的方法来检查每个块是否具有此默认值或用户定义的值?
提前致谢。
答案 0 :(得分:2)
分配有malloc
的内存(以及在堆栈上分配的变量)的内容是 undefined ,所以很可能是任何东西。通常你会得到填充零的空间(因为操作系统会清空其他进程使用的内存页)或以前使用这些内存页的残留(如果内存页属于你的进程,通常就是这种情况),但这是发生了什么事情,C标准没有给出任何保证。
所以,一般来说,没有“默认值”,也无法检查你的记忆是否已被改变;但是你可以使用魔术值初始化你使用的内存块,你确定它不会被用作“真实数据”,但它只是你应用程序内部的约定。
幸运的是,对于浮点变量,有几个神奇的值,比如可以用于此目的的静音NaN;通常,您可以使用NAN
中定义的宏<math.h>
将float
设置为NaN。
顺便说一句,你不应该阅读未初始化的float
和double
,因为它们存储的通常格式(IEEE 754)包含一些神奇的值(如信令NaN)可以在读取时引发算术异常,因此如果未初始化的内存恰好包含这样的位模式,您的应用程序可能会崩溃。
答案 1 :(得分:1)
不需要C运行时来初始化您自己没有初始化的任何内存,并且它们保存的值基本上是从上次使用内存时遗留下来的随机垃圾。您必须首先明确地将它们全部设置为NULL或使用calloc。
答案 2 :(得分: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
会产生错误,因此最好使用isnan()
,而不是==
来测试是否存在值。
答案 3 :(得分:0)
在C中,自动变量不会自动初始化。您需要将变量显式设置为0,如果它是您想要的。
malloc
同样适用于初始化它分配的堆上的空间。如果要初始化它,可以使用calloc
:
a = malloc( numNodes*sizeof(float*) ); // no need to initialize this
for ... {
a[i] = calloc( numNodes-1, sizeof(float) );
}
答案 4 :(得分:0)
在填充之前,我注意到数组中的每个块都已保存此值:-431602080.000000而不是NULL。这是为什么?
malloc()
不会初始化它分配的内存。如果您想要calloc()
初始化
0
void *calloc(size_t nelem, size_t elsize);
calloc()
函数为nelem
元素数组分配未使用的空间,每个元素的大小以字节为单位elsize
。该空间应初始化为所有位0。