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'd 指针的大小,而不是你的结构。

将您的 malloc 调用更改为 allocate sizeof(Node)(或者sizeof(*node->node0)......虽然我认为前者更容易看到)。

于 2013-02-02T03:32:42.383 回答
1

我认为问题在于你只有 malloc(sizeof Node *)。所以你只是为一个不够的指针分配内存!

你应该 malloc(sizeof 节点)。

尝试将 malloc(sizeof node->childx) 更改为 malloc(sizeof *node->childx)。

于 2013-02-02T03:32:17.443 回答