1

私はMallocを使ってポインタの配列を作成しています。しかし、私はvalgrindを受け取っています条件付きジャンプまたは移動は、配列のインデックスの1つで何かを参照しようとするたびに、初期化されていない値に依存します。私のコードでは、何らかのインデックスがインデックスに格納されることがあります。例えば、値1、4、6にはポインタが格納されていても、他のポインタにはポインタが格納されていない可能性があります。私の目標は、valgrindのエラーなしでそれを判断できるようにすることです!Malloc配列、初期化されていない値の条件ジャンプ

typedef struct{ 
    char* symbol; 
    void* datapointer; 
    void* nextstruct; 
}Entry; 
void main(){ 
int sizeHint = 10000; //size of array 
Entry** arrayOfPointers = malloc(sizeHint * sizeof(Entry*)); 

//For the sake of keeping this simple, say I stored something 
//in a bunch of indexes in the array but NOT at 5 

if(arrayOfPointers[5] != NULL){ 
    //this is where my error comes, as it reads 
    //conditional jump or move depends on uninitilised value 
    //my goal is to be able to determine if something is stored at an index, and 
    //do something if its not stored 
} 

} 
+0

代わりに 'calloc()'を使うべきです:乗算を行い、オーバーフローをチェックし、メモリをゼロに初期化します。 –

+0

@ JonathonReinhart:現在のC標準は、すべての '0 'のビットパターンがポインタ変数をヌルポインタと等しくすることを強制しません:http://stackoverflow.com/questions/42471057/malloc-array-conditional -jump-on-uninitialized-values/42471123#comment72082868_42471123 – alk

答えて

2

何かがポインタの配列を割り当てた後、インデックス

に格納されている場合、私の目標は、決定することができることです、それを使用する前に、すべてのNULL秒に設定します。

for (size_t i = 0; i < sizeHint; ++i) 
{ 
    arrayOfPointers[i] = NULL; 
} 

malloc()あなたのためにこれを行いません。

C11標準(ドラフト)7.22.3.4/2から:

malloc関数は、そのサイズ値が不定であるサイズと で指定されたオブジェクトのためにスペースを割り当てます。

+1

さらに、 'calloc()'を使用してください。 –

+1

@ JonathonReinhart:標準の観点からは、ポインタ値が0になっても必ずしもそれらがヌルポインタ値に等しいというわけではありません。 – alk

+1

@JonathonReinhart:7.22.3.2: "*** calloc関数** [...]スペースはすべてのビット0に初期化されます。296)[...] 296):これは次のコードと同じである必要はありません。 [...]ヌルポインタの表現 定数* " – alk

0

mallocでの割り当て後、メモリは自動的にNULL(または他のもの)に初期化されません。それはまだvalgrindがあなたに比較について警告する理由である何かを含むことができます。

memset(arrayOfPointers, 0, sizeHint * sizeof(Entry*)); 

のmemset関数はstring.hヘッダファイルによって提供され、使用できる(少なくともGCCclangMSVCによってNULLとして扱われる)を0に全体の割り当てを初期化する

+0

* "残念ながら、すべての要素がNULLであることを確認できます*"。 [このコメント](http://stackoverflow.com/questions/42471057/malloc-array-conditional-jump-on-uninitialized-values/42471123#comment72082868_42471123)をご覧ください。 – alk

+0

ありがとう、それを知らなかった。答えを少し変更しました。 – Moritz

+0

これは明らかに間違っていませんが、これが意味することをさらに説明することなく、「*通常は*」という言葉で答えが良い答えになりません... – alk

関連する問題