C指针地址很奇怪

C pointer address is very strange

对不起我的英文不好,我已经写了Splaying tree的C代码,但是当我把"Find()"操作放在main函数中时,我无法初始化Tree,也就是没有这行"Find()" , 使用 GDB, 我发现 my_tree 的值是 "0x0" 当断点在行 "MakeEmpty" 时, 但是添加行 "Find", 值是 "0x7fffffffbeb0" .我知道 Find() 函数有问题,但我不明白为什么后面的语句会感染前面的语句?

#include<stdio.h>
#include "SPTree.c"

void main()
{
    Position my_tree;

    my_tree = MakeEmpty( my_tree );

    my_tree = Insert( 5, my_tree );
    my_tree = Insert( 6, my_tree );

    Position P = Find( 5, &my_tree );
}

声明如下

struct SPNode;
typedef struct SPNode *Position;
typedef struct SPNode *SPTree;
typedef int ElementType;

和树节点

struct SPNode
{
    ElementType Element;
    SPTree Left;
    SPTree Right;
};

这是插入

SPTree Insert( ElementType X, SPTree tree )
{
    if( tree == NULL )
    {
        //此时 tree 是一棵空树,分配空间并创建一棵树
        tree = malloc( sizeof( struct SPNode ) );
        if( tree == NULL )
            printf("Out of space!!!\n");
        else
        {
            tree->Element = X;
            tree->Left = tree->Right = NULL;
        }
    }
    else
    {
        //递归插入 X 到合适的子树中
        if( X < tree->Element )
            tree->Left = Insert( X, tree->Left );
        else if( X > tree->Element )
            tree->Right = Insert( X, tree->Right );
        else
            //X已经在树中,什么也不做
            ;
    }
    return tree;
}

这是在我的 github 存储库中找到的(因为它太长了):https://github.com/hengyicai/Find/blob/master/Find.c

我困惑的是:当主函数像这样时

void main()
{
    Position my_tree;  //line 1

    my_tree = MakeEmpty( my_tree );

    my_tree = Insert( 5, my_tree );
    my_tree = Insert( 6, my_tree );

}

我在第 1 行调试断点,并打印 my_tree 的值为 0x0,如下所示

请看这里:“https://raw.githubusercontent.com/hengyicai/Find/master/”请看Pic_1.png.

但是在将 Find() 函数添加到 main.c

之后
#include<stdio.h>
#include "SPTree.c"

void main()
{
    Position my_tree;

    my_tree = MakeEmpty( my_tree );

    my_tree = Insert( 5, my_tree );
    my_tree = Insert( 6, my_tree );

    Position P = Find( 5, &my_tree );
}

我这样得到my_tree的值:请看上面link中的Pic_2.png。

为什么my_tree的值和前面的不一样,把Find()加到最后一行就可以了?

MakeEmpty() 函数 return 指针还是值?

代码很奇怪。 我想 MakeEmpty() 可以 return 一个指向空 Position 结构的指针。

通常你可以选择 2 种方式,对于 return 来自函数的指针:

1 - 检索指针作为传递参数;

2 - 将指针检索为 return 值;

typedef foo_t;

foo_t foo;


pass_bar(foo_t **pass_foo)
{

    ...
    //Set the pointer to the **pass_foo parameter
} 


foo_t* return_foo(void)
{
   foo_t *my_foo;

   //Set the pointer my_foo to a valid memory address for foo_t 
   ...
   return my_foo;
}

您已经添加了标签 pointers,但是在这段代码中您没有使用任何指针...