2017-01-11 20 views
1

私はCでトライを実装しようとしています。私のコードは正しくコンパイルされますが、valgrindで実行するとエラーが表示されます。ここでトライですべての子をNULLに設定する方法

typedef struct node { 
bool end; 
struct node *chil[26]; 
} NODE; 
int main() 
{ 
    NODE* ne = (NODE*)malloc(sizeof(NODE)); 
    if(ne->chil[1] == NULL) printf("\nzwycięstwo!\n"); 
    free(ne); 
    return 0; 
} 

とエラー報告されている:

== ==条件付きジャンプまたは移動が初期化されていない値(S)

== 3346に依存3346 =は、ここで問題と一部であります= 0x40076Bで:メイン(exp.c:21)

== 3346 ==未初期化値がヒープ割り当て

== 3346 == aで作成されましたT 0x4C2AB80:0x40075Aによってはmalloc(/usr/lib/valgrind/vgpreload_memcheck-amd64->linux.soで)

== 3346 ==:メイン(exp.c:20) `

I私は明示的に

ne->chill = {NULL}; 

ことを言っていると思いますが、これは「期待される表現」

私は何をすべきコンパイラエラー になり? NULLにポインタを設定するために配列全体を調べることを避けることはできますか?

+1

まず、「ne」自体をチェックする必要があります。次に、初期化されていないオブジェクトは読み込まないでください。 "ポインタをNULLに設定するために配列全体を調べることはできますか?" - 値を使用しないでください。しかし、Cの慣習に従う方が簡単です。 – Olaf

答えて

2

ループは、あなたが提案callocまたはmemsetを使用するように聞こえるかもしれNULL値

for (int i = 0; i < 26; ++i) 
    ne->chil[i] = NULL; 

に移植可能なすべてのポインタを設定する唯一の方法です。しかし、ゼロビットパターンは必ずしもポインタのNULL値と同じではありません。たとえ多くのプラットフォームがそれをそのように実装しても。

+0

'memset(...、NULL);'は動作しませんか? – Stargateur

+0

@Stargateur:賢明なコンパイラは、アーキテクチャがヌルポインタに全ビットゼロの表現を使用するかどうかを知る必要があるので、これを 'memset'とにかく(あるいは大いに最適化されたインライン変形)変換するかもしれません。実装の詳細をツールチェーンに残しておきます(本当にこれを問題として特定しない限り)。 – Olaf

関連する問題