C指针地址很奇怪

时间:2015-03-06 09:44:04

标签: c pointers data-structures

抱歉我的英语不好,我已经为Splaying树写了C代码,但是当我把#34; Find()"在main函数中操作,我无法初始化Tree,也就是说,没有行" Find()" ,使用GDB,我发现my_tree的值是" 0x0"当行中的断点" MakeEmpty",但添加行"查找"时,值为" 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,如下所示

请看这里:&#34; https://raw.githubusercontent.com/hengyicai/Find/master/&#34;请参阅Pic_1.png。

但将Find()finction添加到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的值如下:请参阅上面链接中的Pic_2.png。

为什么my_tree的值与前一个不同,只需将Find()添加到最后一行?

1 个答案:

答案 0 :(得分:0)

MakeEmpty()函数返回指针或值?

代码非常奇怪。 我想MakeEmpty()可以返回指向空Position结构的指针。

通常你可以选择2路,从函数返回一个指针:

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

2 - 将指针检索为返回值;

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,但在这段代码中您不使用任何指针...