C 指针(树)如何在两行中返回两个不同的值?
我的程序中有以下代码:C 指针(树)如何在两行中返回两个不同的值?,c,C,我的程序中有以下代码: /*Making a tree using linked lists. */ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> typedef struct node { int value; struct node * left; struct node * right; }Node; Node * tree; Node * maketree(int number) { No
/*Making a tree using linked lists.
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
typedef struct node
{
int value;
struct node * left;
struct node * right;
}Node;
Node * tree;
Node * maketree(int number)
{
Node p = { number, NULL, NULL };
return &p;
}
int main()
{
int a[5] = { 1, 2, 3, 1, 4 };
int number;
number = a[0];
tree = maketree(number);
printf("Root has a value of %d\n", tree->value);
printf("Root has a value of %d\n", tree->value);
}
/*使用链接列表创建树。
*/
#定义\u CRT\u安全\u无\u警告
#包括
类型定义结构节点
{
int值;
结构节点*左;
结构节点*右;
}节点;
节点*树;
节点*生成树(整数)
{
节点p={number,NULL,NULL};
返回&p;
}
int main()
{
inta[5]={1,2,3,1,4};
整数;
数字=a[0];
树=生成树(编号);
printf(“根目录的值为%d\n”,树->值);
printf(“根目录的值为%d\n”,树->值);
}
输出:
Root的值为1
根目录的值为“某个垃圾值!”
我无法理解当我根本不玩它并在连续两行中打印它的值时,树如何指向其他地址(或打印一些垃圾值) 返回的是局部变量的地址
&p
当maketree()
退出时,此变量超出范围,导致取消引用指针的行为未定义
实际上,您正在取消引用一个指向堆栈空间的指针,该堆栈空间是由maketree()
分配的,但从那时起已被取消分配,并且很可能被重复使用(由printf()
,这是一个相当繁重的函数)。这是完全无效的代码
修复方法是在堆上分配新节点:
Node * maketree(int number)
{
Node *p = malloc(sizeof *p);
if(p != NULL)
{
p->value = number;
p->left = p->right = NULL;
}
return p;
}
返回的是局部变量的地址
&p
当maketree()
退出时,此变量超出范围,导致取消引用指针的行为未定义
实际上,您正在取消引用一个指向堆栈空间的指针,该堆栈空间是由maketree()
分配的,但从那时起已被取消分配,并且很可能被重复使用(由printf()
,这是一个相当繁重的函数)。这是完全无效的代码
修复方法是在堆上分配新节点:
Node * maketree(int number)
{
Node *p = malloc(sizeof *p);
if(p != NULL)
{
p->value = number;
p->left = p->right = NULL;
}
return p;
}
在函数中
Node * maketree(int number)
{
Node p = { number, NULL, NULL };
return &p;
}
您正在返回一个局部变量的地址,即p
。局部表示变量p
的存储位置在函数结束后不再保留给p
。没有什么可以阻止它被覆盖。这称为未定义的行为
您应该使用动态分配:
Node * maketree(int number)
{
Node *pp;
pp = malloc(sizeof(*pp));
if(pp != NULL)
{
pp->value = number;
pp->left = NULL;
pp->right = NULL;
}
return pp;
}
在函数中
Node * maketree(int number)
{
Node p = { number, NULL, NULL };
return &p;
}
您正在返回一个局部变量的地址,即p
。局部表示变量p
的存储位置在函数结束后不再保留给p
。没有什么可以阻止它被覆盖。这称为未定义的行为
您应该使用动态分配:
Node * maketree(int number)
{
Node *pp;
pp = malloc(sizeof(*pp));
if(pp != NULL)
{
pp->value = number;
pp->left = NULL;
pp->right = NULL;
}
return pp;
}
为什么要投否决票?这是一个很好的问题。为什么投反对票?这是一个很好的问题。@user2684198它与保存指针本身的位置无关,而与指针指向的位置有关。好的,是的。我明白了。非常感谢:-)@user2684198它与保存指针本身的位置无关,而与指针指向的位置有关。好的,是的..我明白了。非常感谢:-)