1

サンプルコード:

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

上記で動的な2D配列を作成しています。移入する前に、配列内の各ブロックがすでに次の値を保持していることに気付きました:-431602080.000000であり、NULLではありません。どうしてこれなの?
配列内のすべてのスペースが使用されない場合があります。
したがって、私のクエリは単純です。各ブロックにこのデフォルト値またはユーザー定義値があるかどうかを確認するための洗練された方法はありますか?

前もって感謝します。

4

5 に答える 5

2

で割り当てられたメモリの内容malloc(およびスタックに割り当てられた変数の内容)は未定義であるため、何でもかまいません。通常、スペースはゼロ(他のプロセスで使用されていたメモリページをOSが空白にするため)またはそれらのメモリページの以前の使用の残余(メモリページがプロセスに属している場合によくあることです)で埋められますが、これは内部で何が起こるか、C標準はいかなる保証も与えません。

したがって、一般に「デフォルト値」はなく、メモリが変更されたかどうかを確認する方法もありません。ただし、「実際のデータ」として使用されないことが確実なマジック値で使用するメモリブロックを初期化することはできますが、これはアプリケーション内部の慣例にすぎません。

幸いなことに、浮動小数点変数には、この目的に使用できるクワイエットNaNのようないくつかの魔法の値があります。NAN一般に、で定義されたマクロを使用して、をNaN<math.h>に設定できます。float

ちなみに、初期化されていないfloatsとdoublesは読み取らないでください。これらが格納されている通常の形式(IEEE 754)には、読み取られたときに算術例外を発生させる可能性のあるいくつかのマジック値(シグナリングNaNなど)が含まれているため、初期化されていない場合はメモリにそのようなビットパターンが含まれていると、アプリケーションがクラッシュする可能性があります。

于 2010-12-31T12:27:22.947 に答える
1

Cランタイムは、自分で初期化していないメモリを初期化する必要はありません。Cランタイムが保持する値は、基本的に、メモリが最後に使用されたときに残ったランダムなゴミです。最初にそれらすべてを明示的にNULLに設定するか、callocを使用する必要があります。

于 2010-12-31T12:20:11.677 に答える
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
}

覚えておくべき重要なことが1つあります。falseNaN == NaNが生成されるため、この値の存在をテストするのisnan()ではなく、を使用することをお勧めします。==

于 2010-12-31T12:54:18.223 に答える
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()の要素の配列に未使用のスペースを割り当てます。スペースはすべてのビット0に初期化されます。nelemelsize

于 2010-12-31T12:20:19.830 に答える