| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 763 人关注过本帖
标题:数据结构问题
只看楼主 加入收藏
z6439186
Rank: 1
等 级:新手上路
帖 子:16
专家分:2
注 册:2011-11-15
结帖率:33.33%
收藏
已结贴  问题点数:10 回复次数:7 
数据结构问题
#include<stdio.h>
#include<stdlib.h>
typedef struct stack
{
    int data;
    struct stack *next;
}linkstack,*linklist;
linklist stack=NULL;
void push(int i)
{
    int j;
    linklist q;
    for(j=0;j<i;j++)
    {
        q=(linklist)malloc(sizeof(linkstack));
        q->next=NULL;
        scanf("%d",&q->data);
        q->next=stack;
        stack=q;
    }
}
void pop()
{
    linklist p;
   while(stack!=NULL)
   {
       p=stack;
       printf("%d",p->data);
       free(p);//为什么加了这个以后就只能输出一个了呢
       stack=stack->next;
   }

}
void main()
{
    int x;
    scanf("%d",&x);
    push(x);
     pop();
}
希望告诉我下,详细点,为什么不能释放啊
void main()
{
    int x;
    linklist p,q;
    scanf("%d",&x);
p=push(stack1,x);
q=push(stack2,x);//把push函数变为void push(stack),没有return stack,直接用push(stack1,x);push(stack2,x);pop(stack1);pop(stack2)不行呢,输不出结果,难道stack的值没有变化吗,同时linklist stack=NULL; 在程序里是什么,是不是全局变量啊

     pop(p);
      pop(q);
}
搜索更多相关主题的帖子: next void include 
2012-05-10 11:15
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:5 
void pop()
{
    linklist p;
   while(stack!=NULL)
   {
       p=stack;
       printf("%d",p->data);
       free(p);//为什么加了这个以后就只能输出一个了呢
       stack=stack->next;
   }
}
可以看出来写得比较用心。 free(p)在释放p节点的空点,而p节点指向stack。
既然stack在第一次被释放了,下面一句stack=stack->next; 没有死机算是幸运,以后的全局变量stack应该是一个随机数。
你可以写成如下:
void pop()
{
    linklist p;
   while(stack!=NULL)
   {
       p=stack;
       printf("%d",p->data);
       stack=stack->next;
       free(p);   }
}

2012-05-10 12:16
z6439186
Rank: 1
等 级:新手上路
帖 子:16
专家分:2
注 册:2011-11-15
收藏
得分:0 
知道了,但我想问下为什么p=push(stack1,x);
q=push(stack2,x);//把push函数变为void push(stack),没有return stack,直接用push(stack1,x);push(stack2,x);pop(stack1);pop(stack2)不行呢,输不出结果,难道stack的值没有变化吗,同时linklist stack=NULL; 在程序里是什么,是不是全局变量啊
到底是什么原因啊

2012-05-10 13:11
低调求学
Rank: 2
等 级:论坛游民
帖 子:51
专家分:33
注 册:2012-5-9
收藏
得分:5 

void pop()
 {
     linklist p;
    while(stack!=NULL)
    {
        p=stack;
        printf("%d",p->data);
        free(p);//为什么加了这个以后就只能输出一个了呢
        stack=stack->next;
    }
 }
 可以看出来写得比较用心。 free(p)在释放p节点的空点,而p节点指向stack。
 既然stack在第一次被释放了,下面一句stack=stack->next; 没有死机算是幸运,以后的全局变量stack应该是一个随机数。

二楼的大侠:我想请问一下,我觉得吧,free(p)只是告诉操作系统p所指向的内容可以重新利用,但是p所指内存中内容没有发生改变应该还可以用啊,就如同:
int *p=(int *)malloc(sizeof(int));
int *q;
q=p;
printf("%d\n",*p);
free(p);
printf("%d\n",*q);

result:
123
123

这又是为什么呢???

2012-05-10 13:53
低调求学
Rank: 2
等 级:论坛游民
帖 子:51
专家分:33
注 册:2012-5-9
收藏
得分:0 
回复 2楼 silent_world
void pop()
 {
      linklist p;
     while(stack!=NULL)
     {
         p=stack;
         printf("%d",p->data);
         free(p);//为什么加了这个以后就只能输出一个了呢
         stack=stack->next;
     }
 }
可以看出来写得比较用心。 free(p)在释放p节点的空点,而p节点指向stack。
 既然stack在第一次被释放了,下面一句stack=stack->next; 没有死机算是幸运,以后的全局变量stack应该是一个随机数。
 
二楼的大侠:我想请问一下,我觉得吧,free(p)只是告诉操作系统p所指向的内容可以重新利用,但是p所指内存中内容没有发生改变应该还可以用啊,就如同:
 int *p=(int *)malloc(sizeof(int));
 int *q;
 q=p;
 printf("%d\n",*p);
 free(p);
 printf("%d\n",*q);
 
result:
 123
 123
 
这又是为什么呢???
 
2012-05-10 13:54
z6439186
Rank: 1
等 级:新手上路
帖 子:16
专家分:2
注 册:2011-11-15
收藏
得分:0 
上面楼的错了啊,你p和q输出来的结果不一样啊,既然你free(p)了,就相当于把它所指向的内存释放了啊,那他就属于脏数据;也就是说,这部分数据可能存在并且维持原来的值,也可能被清空,或者被修改为其他值;就不能再引用它了,以前所指向他的指针也不能再用了,再用的话就是非法的了
2012-05-11 17:58
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:0 
呵呵,楼上说的有道理。

free(p)在释放后,仅仅是将其重新放回到内存管理中,其中的数据在这个过程中不会变化。
数据的变化可能有以下几个途径:
1、内存管理器在回收内存碎片时;
2、空间在其他地方被使用。
这两种情况都不属于逻辑控制范畴,也就是说,连编程人员都不会知道到底会不会出错,以后的逻辑就不在控制范围,代码的健壮性会降低。



2012-05-12 11:34
会分手的空气
Rank: 2
来 自:湖北孝感
等 级:论坛游民
帖 子:26
专家分:32
注 册:2012-3-30
收藏
得分:0 
嗯嗯,你应该先执行stack=stack->next;
然后再free函数啊 啊,,,,
2012-06-03 08:55
快速回复:数据结构问题
数据加载中...
 
   



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

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