标题:指向结点的结构体指针,再进入子函数中,它的结点成员为什么会改变?求原理 ...
取消只看楼主
邹生笑谈
Rank: 2
等 级:论坛游民
帖 子:5
专家分:10
注 册:2020-12-5
结帖率:100%
已结贴  问题点数:10 回复次数:1 
指向结点的结构体指针,再进入子函数中,它的结点成员为什么会改变?求原理。
注:为了代码的方便,我只写一个子函数。通过循环使用这个函数,来测试指针进入函数内后成员的改变。
本程序在vs2010中进行的调试。

程序代码:
#include<stdio.h>
//结构体定义
typedef struct LNode
{
    int date;
    struct LNode *next;
}node,*LinkNode;
//问题测试函数
void issue(LinkNode &L)
{
    printf("\n进入函数内\nL的地址%x, L指向的地址%x, L->date的值%d和地址%x, L->next的值%x\n",&L,L,L->date,&L->date,L->next);
    node p;
    L=&p;     //-----关键点,注释后,则第二次进入函数,L->date正常不会变了
    L->date=2;
    printf("赋值后\nL的地址%x, L指向的地址%x, L->date的值%d和地址%x, L->next的值%x\n\n",&L,L,L->date,&L->date,L->next);
}
//主函数
void main()
{
    LinkNode L=new node;
    printf("\n初始化后\nL的地址%x, L指向的地址%x, L->date的值%d和地址%x, L->next的值%x\n",&L,L,L->date,&L->date,L->next);
    issue(L);
    printf("\n主函数\nL的地址%x, L指向的地址%x, L->date的值%d和地址%x, L->next的值%x\n",&L,L,L->date,&L->date,L->next);
    issue(L);
    printf("\n主函数\nL的地址%x, L指向的地址%x, L->date的值%d和地址%x, L->next的值%x\n\n",&L,L,L->date,&L->date,L->next);
}

输出结果如下:
我上传不了图片,就描述一下吧:
    在函数中,让结构体指针指向“在函数内创建的结构体(不是结构体指针哦)”并给date赋值,回到主函数后->date值正常。
    但再传指针进去某个函数后,发现它的->date就变了。

    通过输出地址,发现结构体指针&L正常,结构体指针指向的地址L也没有变化,就是结构体的成员L->date变了。
    并且发现,“结构体指针指向的地址”与结构体成员“L-date”的地址一样。

请问为什么会有粗体部分?
搜索更多相关主题的帖子: next 结构体 指向 地址 date 
2021-12-19 00:21
邹生笑谈
Rank: 2
等 级:论坛游民
帖 子:5
专家分:10
注 册:2020-12-5
得分:0 
回复 2楼 rjsp
也就是说,在为链表(或链式存储结构)操作时,在函数内添加的临时结点(或新结点),只能用结构体指针类型变量
    若是用结构体变量来定义新结点,尽管第一次回到主函数中能用,但传递进函数后,里面的数据就会又乱了。
即能
程序代码:
{
    node *p;
    L->next=p;
    p.date=2;
}

不能
程序代码:
{
    node p;
    L->next=p;
    p.date=2;
}

你平时写链式结构代码都是用结构体指针变量做新结点吗?

附上次运行结果(我确实是没想到这一层):
初始化后
L的地址eff838, L指向的地址1481ac0, L->date的值5和地址1481ac0, L->next的值cdcdcdcd

进入函数内
L的地址eff838, L指向的地址1481ac0, L->date的值5和地址1481ac0, L->next的值cdcdcdcd
赋值后
L的地址eff838, L指向的地址eff744, L->date的值2和地址eff744, L->next的值cccccccc


主函数
L的地址eff838, L指向的地址eff744, L->date的值2和地址eff744, L->next的值cccccccc

进入函数内
L的地址eff838, L指向的地址eff744, L->date的值-858993460和地址eff744, L->next的值cccccccc
赋值后
L的地址eff838, L指向的地址eff744, L->date的值2和地址eff744, L->next的值cccccccc


主函数
L的地址eff838, L指向的地址eff744, L->date的值2和地址eff744, L->next的值cccccccc
2021-12-19 19:15



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-507911-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.328387 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved