为什么我的程序是逐步执行但不是正常执行?

时间:2013-02-02 03:20:29

标签: c gcc codeblocks

我的项目的想法是在重复实验上建立一个概率树,其中包含几种可能的结果。

这是一个非常简单的项目,我认为我做对了。它是一个基本的树构建:有一个构建递归函数,它确定节点值并初始化子节点,然后构建子节点。

简化代码:

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选项可能吗?编译问题? 感谢。

2 个答案:

答案 0 :(得分:4)

(决定移动评论回答)

sizeof(node->node0)没有按照您的想法行事。你只需要指定一个指针的大小,而不是你的结构。

更改你的malloc调用以分配sizeof(Node)(或sizeof(*node->node0) ...虽然我认为前者更容易看到它们。

答案 1 :(得分:1)

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

你应该是malloc(sizeof Node)。

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