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
,但是在这段代码中您没有使用任何指针...
对不起我的英文不好,我已经写了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
,但是在这段代码中您没有使用任何指针...