我正在写树状,作为其中的一部分,我需要它有两个函数,它们都返回一个指针:一个用于创建叶节点,另一个用于创建内部节点。我的头文件如下:
#ifndef NODE_H
#define NODE_H
#include<stdint.h>
typedef uint32_t Number;
typedef struct Node
{
Number val, height;
struct Node *left, *right, *parent;
} Node;
//makes leaves
Node* make_node (Number);
//makes internal nodes
Node* make_internal (Node*, Node*);
//you'll see why we need these
inline Number num_min(Number, Number);
inline Number num_max(Number, Number);
#endif
实施如下:
#include "node.h"
#include <stdlib.h>
inline Number num_min(Number a, Number b) {
return (a < b) ? a : b;
}
inline Number num_max(Number a, Number b) {
return (a > b) ? a : b;
}
//makes a new leaf node
Node* make_node (Number n) {
Node* u = calloc(1, sizeof(Node));
u->val = n;
u->height = 0;
return u;
}
//makes a new internal node
Node* make_internal (Node* u, Node* v) {
Node* uv = calloc(1, sizeof(Node));
uv->left = u;
uv->right = v;
uv->val = num_min(u->val, v->val);
uv->height = num_max(u->height, v->height) +1;
u->parent = uv;
v->parent = uv;
}
现在,make_node
工作正常(使用assert
语句测试),但make_internal
没有。例如,执行此代码会导致coredump:
Node* u = make_node(10);
Node* v = make_node(20);
Node* uv = make_internal(u, v);
assert(uv->val == 10); //this assert fails
当我在运行时检查uv->val
(使用printf
)的值时,结果是20而不是10!我完全感到困惑(以及C的新手),并希望得到所有可能的帮助。
答案 0 :(得分:5)
make_internal
未返回uv
。它的结果可以是任何东西。
答案 1 :(得分:3)
尝试使用-Wreturn-type
进行编译,以确认make_internal
没有返回任何内容,尽管它被声明为返回Node*
:
prism:Dev jack$ gcc -Wreturn-type a.c
a.c: In function ‘make_internal’:
a.c:49: warning: control reaches end of non-void function