C问题:通过指针使用赋值时,结构中的int值很奇怪

vnzz0bqm  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(122)

我是C语言的新手,想写一个二叉树的代码,用插入,删除和等待的方法。在代码中,我用value = 0来表示这个结构还没有定义。(我不知道还有什么更好的方法)。问题:我们不应该插入值0。我遇到的主要问题是:为什么printf("%d\n", root.pLeft->value);打印的是数字6422476而不是3?`

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Node {
    int value;
    struct Node *pLeft;
    struct Node *pRight;
};

void insert(struct Node *root, int value) {
    struct Node *current = root;
    while (current->value != 0) {
        if (value < current->value) {
            current = current->pLeft;
        } else {
            current = current->pRight;
        }
    }
    current->value = value;
    struct Node newLeft;
    newLeft.value = 0;
    struct Node newRight;
    newRight.value = 0;
    current->pLeft = &newLeft;
    current->pRight = &newRight;
}

int main() {
    struct Node root;
    root.value = 0;

    insert(&root, 4);
    insert(&root, 3);

    printf("%d\n", root.value);
    printf("%d\n", root.pLeft->value);
    
    return 0;
}

`

643ylb08

643ylb081#

问题就在这里:

struct Node newLeft;
    newLeft.value = 0;
    struct Node newRight;
    newRight.value = 0;
    current->pLeft = &newLeft;
    current->pRight = &newRight;
}

newLeftnewRight是存储类“auto”中的局部变量,因此它们将在封闭块结束时死亡(结束它们的生存期)。
但是你使用的是这些对象的地址,* 在块之外 *,因为它们的地址逃离了块,所以你有了悬空指针。
解决方案是通过mallocfree的方式动态分配对象。

oyxsuwqo

oyxsuwqo2#

在函数insert中,数据成员pLeftpRight被设置为具有自动存储持续时间的本地对象的地址。

current->value = value;
struct Node newLeft;
newLeft.value = 0;
struct Node newRight;
newRight.value = 0;
current->pLeft = &newLeft;
current->pRight = &newRight;

这些对象newLeftnewRight在退出函数后将不再有效。因此指针pLeftpRight将无效,并且取消对它们的引用将调用未定义的行为。
你的方法是错误的。你需要使用struct Node *类型的指针,它将指向树中动态分配的节点。从main中的这个声明开始

struct Node *root = NULL;

然后函数insert在需要时动态分配树的节点。
例如,可以通过以下方式定义函数

struct Node {
    int value;
    struct Node *pLeft;
    struct Node *pRight;
};

int insert( struct Node **root, int value ) 
{
    while ( *root != NULL ) 
    {
        if ( value < ( *root )->value ) 
        {
            root = &( *root )->pLeft;
        } 
        else 
        {
            root = &( *root )->pRight;
        }
    }

    struct Node *new_node = malloc( sizeof( *new_node ) );
    int success = new_node != NULL;

    if ( success )
    {
        new_node->value  = value;
        new_node->pLeft  = NULL;
        new_node->pRight = NULL;

        *root = new_node;
    }

    return success;
}

函数的调用方式如下

struct Node *root = NULL;

insert( &root, 4 );
insert( &root, 3 );

printf( "%d\n", root->value );
printf( "%d\n", root->pLeft->value );

相关问题