1

私のプロジェクトのアイデアは、いくつかの可能な結果を​​伴う反復実験で確率ツリーを構築することです。

これは非常に単純なプロジェクトであり、私はそれを正しく行ったと思います。これは基本的なツリー構築です。ノード値を決定し、子を初期化してから子を構築する構築再帰関数があります。

簡略化されたコード:

typedef struct Node {
    int depth;
    int noElements;
    float probability;
    struct Node *node0,*node1,*node4;
} Node;

void buildProbabilityTree(Node *node, int maxDepth) {
    node->child1=malloc(sizeof node->child1);
    //... set child1 values ...
    buildProbabilityTree(node->child1,maxDepth);

    node->child2=malloc(sizeof node->child2);
    //... set child2 values ...
    buildProbabilityTree(node->child2,maxDepth);

    node->child3=malloc(sizeof node->child3);
    //... set child3 values ...
    buildProbabilityTree(node->child3,maxDepth);
}

int main(int argc, char *argv[]) {

    Node root={0,0,1,NULL,NULL,NULL};
    buildProbabilityTree(&root,3);

    return EXIT_SUCCESS;
}

完全なコード (50 行のみ) http://pastie.org/private/cqiazmgp4bvexcidzlmutg

問題は: 動かない!

Codeblock と GNU gcc コンパイラを使用しています。ステップ ツー ステップ デバッグを実行すると、プログラムは問題なく終了します。しかし、デバッガーなしでビルドすると、確率ツリーの「底」に到達したときにプログラムがクラッシュします。

誰がそれがどこから来たのか知っていますか? Code::Blocks オプションでしょうか。コンパイラの問題?ありがとう。

4

2 に答える 2

4

(コメントを回答に移動することにしました)

sizeof(node->node0)あなたが思っていることをしません。構造体ではなく、ポインタのサイズをmallocしただけです。

malloc 呼び出しを allocate に変更しますsizeof(Node)(またはsizeof(*node->node0)... 前者の方が見やすいと思いますが)。

于 2013-02-02T03:32:42.383 に答える
1

問題は、malloc(sizeof Node *) のみであることだと思います。したがって、十分ではないポインタにのみメモリを割り当てています!

malloc(sizeof Node) する必要があります。

malloc(sizeof node->childx) を malloc(sizeof *node->childx) に変更してみてください。

于 2013-02-02T03:32:17.443 に答える