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它与保存指针本身的位置无关,而与指针指向的位置有关。好的,是的..我明白了。非常感谢:-)