You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言二叉树节点创建:结构体成员输入需&与->配合吗?

为什么用->访问结构体成员时,scanf仍需要加&?

核心原因和->无关,只和**scanf的工作机制以及结构体成员的类型**有关:

  1. scanf的本质要求
    scanf的格式占位符(除了%s、%[]这类针对字符串/字符数组的特殊情况),都需要接收变量的内存地址——只有拿到地址,它才能把用户输入的值写入对应的内存空间里。如果直接传变量的值,scanf会把这个值当成内存地址去操作,必然触发非法内存访问,也就是你遇到的崩溃(退出码-1073741819是Windows系统中典型的内存访问错误)。

  2. ->的作用是什么?
    newnode->data等价于(*newnode).data,它的作用是直接获取结构体成员data的值(如果data是普通变量类型的话),而不是获取它的地址。不管你用.(针对结构体变量)还是->(针对结构体指针)访问成员,只要成员是普通非指针类型,它的结果都是变量的值,不是地址。

  3. 为什么之前操作链表不用加&?
    你之前的链表节点大概率是这种情况:

    typedef struct ListNode {
        char* content; // 成员是指针类型
        struct ListNode* next;
    } ListNode;
    

    这时候node->content本身就是一个地址(指针变量存储的就是内存地址),所以传给scanf("%s", node->content)时,直接传的就是地址,符合scanf的要求,自然不用加&。

  4. 本次二叉树节点的区别
    你的二叉树节点定义应该是类似这样:

    typedef struct BTNode {
        char data; // 成员是普通char变量,不是指针
        struct BTNode* left;
        struct BTNode* right;
    } BTNode;
    

    这里的newnode->data是一个普通的char值,不是地址。所以必须用&newnode->data来获取这个char变量的内存地址,传给scanf后,它才能正确把输入的字符写入到这个地址对应的空间里。

总结一下:

  • 若结构体成员是非指针类型的基本变量(char、int、float等),不管用.还是->访问,scanf都需要加&取地址;
  • 若成员是指针类型(比如char*),直接传成员名就是传地址,无需加&。

内容的提问来源于stack exchange,提问作者SpaciousCoder78

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:48:22