标题:指向结点的结构体指针,再进入子函数中,它的结点成员为什么会改变?求原理 ...
只看楼主
邹生笑谈
Rank: 2
等 级:论坛游民
帖 子:5
专家分:10
注 册:2020-12-5
结帖率:100%
已结贴  问题点数:10 回复次数:2 
指向结点的结构体指针,再进入子函数中,它的结点成员为什么会改变?求原理。
注:为了代码的方便,我只写一个子函数。通过循环使用这个函数,来测试指针进入函数内后成员的改变。
本程序在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
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:10 
我上传不了图片,就描述一下吧
就是能贴图也不应该贴图。文字不好吗,还是不会拷贝控制台中的文字?

在函数中,让结构体指针指向“在函数内创建的结构体(不是结构体指针哦)”并给date赋值,回到主函数后->date值正常
当退出函数后,你的“在函数内创建的结构体(不是结构体指针哦)”就不存在了。而访问一个已经不存在的对象属于未定义行为
所谓未定义行为,就是C/C++已经无语了,懒得去管了,爱咋地咋地。如果你碰巧得到一个期待的后果,那不是C/C++的功劳;如果你没得到一个期待的后果,那也别怪罪C/C++。
2021-12-19 10:47
邹生笑谈
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.056194 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved