用户定义的最小和最大函数的奇怪行为

Koz*_*oss 0 c c99

我正在写一个树状的,作为其中的一部分,我需要它有两个函数,它们都返回一个指针:一个用于创建叶节点,另一个用于创建内部节点.我的头文件如下:

#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
Run Code Online (Sandbox Code Playgroud)

实施如下:

#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;
}
Run Code Online (Sandbox Code Playgroud)

现在,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
Run Code Online (Sandbox Code Playgroud)

当我在运行时检查uv->val(使用printf)的值时,结果是20而不是10!我完全感到困惑(并且是C的新手),并且会感谢所有可能的帮助.

Adr*_*ian 5

make_internal没有回来uv.它的结果可以是任何东西.