| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1030 人关注过本帖
标题:结构体指针的一个问题
只看楼主 加入收藏
share32
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:214
专家分:663
注 册:2011-12-1
结帖率:60%
收藏
已结贴  问题点数:20 回复次数:17 
结构体指针的一个问题
程序1:
#include "stdio.h"
typedef struct link
{
    int data;
    struct link* next;
}node;

node* p()
{
    node *head,*p,*q,r;
    head=(node*)malloc(sizeof(node));
    p=(node*)malloc(sizeof(node));
    q=(node*)malloc(sizeof(node));
    head->next=p;
    p->next=q;
    p->data=1;
    q->data=3;
    q->next=&r;
    r.data=4;
    r.next=NULL;
    return head;
}   
   
void main()
{
    node *head,*ptr;
    head=p();
    ptr=head;
    while(ptr->next!=NULL)
    {
        printf("%4d",ptr->next->data);
        ptr=ptr->next;
    }
}

----------------------------------------------------------------------------

程序2:
#include "stdio.h"
typedef struct link
{
    int data;
    struct link* next;
}node;

   
   
void main()
{
    node *head,*ptr,*p,*q,r;
    head=(node*)malloc(sizeof(node));
    p=(node*)malloc(sizeof(node));
    q=(node*)malloc(sizeof(node));
    head->next=p;
    p->next=q;
    p->data=1;
    q->data=3;
    q->next=&r;
    r.data=4;
    r.next=NULL;
    ptr=head;
    while(ptr->next!=NULL)
    {
        printf("%4d",ptr->next->data);
        ptr=ptr->next;
    }
}

差别在于一个调用函数,一个都在主函数里面,为什么1不能运行,2可以运行??
搜索更多相关主题的帖子: 结构体 return include void next 
2012-01-07 23:13
战斗!立
Rank: 2
等 级:论坛游民
帖 子:29
专家分:43
注 册:2011-11-26
收藏
得分:7 
亲这个作用域与有关哦,你调用的函数中head在调用函数运行结束之后返回head地址再加*,当你调用函数运行结束它里面没有释放的head的空间去做其他事情了,而达不到你想要的结果,这样是不行的,不知道我哦说的你懂不懂。
2012-01-07 23:32
share32
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:214
专家分:663
注 册:2011-12-1
收藏
得分:0 
回复 2楼 战斗!立
不是很明白。能在具体一点吗?

主要是r有问题。

是因为子函数被调用完以后r就被释放了吗?

可以r.data还是能读出来,但r.next不行。
2012-01-07 23:42
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:7 
程序1的代码做如下修改(方便调试)
程序代码:
#include "stdio.h"
typedef struct link
{
    int data;
    struct link* next;
}node;

node* p()
{
    node *head,*p,*q,r;
    head=(node*)malloc(sizeof(node));
    p=(node*)malloc(sizeof(node));
    q=(node*)malloc(sizeof(node));
    head->next=p;
    p->next=q;
    p->data=1;
    q->data=3;
    q->next=&r;
    r.data=4;
    r.next=NULL;
    return head;
}   
   
void main()
{
    node *head,*ptr;
    head=p();
    ptr=head->next->next;             ;这里做修改
    while(ptr->next!=NULL)            ;断点
    {
        printf("%4d",ptr->next->data);
        ptr=ptr->next;
    }
}
1. 断点观察ptr->next以及ptr->next->data的值
2. 执行printf("%4d",ptr->next->data);发现上述两值产生变化,为什么呢?
3. 之前在函数p里被回收的变量r的地址,重新在printf中被分配,覆盖了原来的值,而不是2楼所说的问题,head都return变量了,还存在作用域问题?



技术问题,请不要以短消息方式提问
2012-01-08 12:04
share32
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:214
专家分:663
注 册:2011-12-1
收藏
得分:0 
回复 4楼 zaixuexi
是不是可以理解为r为局部变量。只在p()被调用的时候其作用,p() 结束后,内存释放。所以&r的值就不确定了?

结构体中其他的值使用指定定义的。所以不受p()影响。

2012-01-08 21:37
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:7 
回复 5楼 share32
那为什么如果p()函数直接返回r的地址给主函数,一样能输出r在p()里赋予的数值。

梅尚程荀
马谭杨奚







                                                       
2012-01-09 08:55
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
回复 5楼 share32
堆和栈你分不清楚?

技术问题,请不要以短消息方式提问
2012-01-09 10:13
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
回复 6楼 有容就大
C语言都是值传递

技术问题,请不要以短消息方式提问
2012-01-09 10:14
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 8楼 zaixuexi
这句话有点深奥啊,是不是地址做参数的本质都是值传递?

梅尚程荀
马谭杨奚







                                                       
2012-01-09 10:31
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
3. 之前在函数p里被回收的变量r的地址,重新在printf中被分配,覆盖了原来的值.

这句话我想了好久,网上查了很久,还是没弄懂。为什么直接把r的地址传给主函数printf就能找到r在子函数的赋值,而当r作为链表中的一员时,就会产生覆盖?

按理说r都是栈分配,子函数完成,r被释放。难道做头真的特殊点?

[ 本帖最后由 有容就大 于 2012-1-9 10:44 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-01-09 10:42
快速回复:结构体指针的一个问题
数据加载中...
 
   



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

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