标题:free的问题
只看楼主
百合杰
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2009-9-26
结帖率:33.33%
已结贴  问题点数:20 回复次数:10 
free的问题
#include<stdio.h>
#include<malloc.h>
int main()
{
    int s[5010],t[2510];
    int c,n,l;
    scanf("%d",&c);
    for(int i=0;i<c;i++)
    {
        scanf("%d",&n);
        
        for(int k=0;k<n;k++)
        s[k]=k+1;
        while(1)
        {
            l=0;
            for(int j=0;j<n;j++)
            {
                if(j%2!=1)
                {
                    t[l]=s[j];
                    l++;
                }
            }
            if(l==3) break;
            free(s);//出错了。。。。。。。。。。。
            int p=0;
            for(int m=0;m<l;m++)
            {
                if(m%3!=2)
                {
                    s[p]=t[m];
                    p++;
                }
            }
            if(p==3) break;
            free(t);//出错了。。。。。。。。。。。。。
        }
        if(l==3)
        for(int q=0;q<3;q++)
            printf("%d",t[q]);
        else
            for(int r=0;r<3;r++)
            printf("%d",s[r]);
    }

    return 0;
}


free时出错了,出错的原因是什么,怎么改?
搜索更多相关主题的帖子: free 
2009-09-26 21:20
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
得分:0 
我在TC2.0下运行,没有出现free()的错误,反而是你中间过程for循环里定义的变量 int i,j,k等等提示错误。
如果把这些变量在一开始就定义好了,是可以通过编译的。
你的程序有点长,能不能说一下该程序想要实现的功能是什么?
2009-09-26 21:38
百合杰
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2009-9-26
得分:0 
回复 2楼 m456m654
恩,给你看原题吧
士兵队列训练问题

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

Time limit: 1000MS    Memory limit: 32768K
Total Submit: 363    Accepted: 148


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

某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。

本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。

共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。

Sample Input
2
20
40

Sample Output
1 7 19
1 19 37

2009-09-26 21:42
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
得分:20 
回复 楼主 百合杰
你的变量是在栈里的,不是用malloc在堆里申请的,所以根本就不能调用free释放它。

[ 本帖最后由 zhddragon 于 2009-9-26 21:51 编辑 ]

身体是玩命的本钱
2009-09-26 21:50
cgaa1
Rank: 2
来 自:uestc
等 级:论坛游民
帖 子:52
专家分:64
注 册:2009-4-11
得分:0 
free函数只能释放由malloc函数创建的单元
2009-09-26 21:53
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
得分:0 
我又试了试,同样没有显示free()的错误,int 变量放开头,这个不说了。
还有一点,你的样例里是输入三个数,但你的程序里只有两个scanf();第三个呢?
我觉得还是程序不够完善。
2009-09-26 21:57
百合杰
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2009-9-26
得分:0 
回复 6楼 m456m654
第一个for循环是用来实现输c次的
2009-09-26 22:00
百合杰
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2009-9-26
得分:0 
回复 5楼 cgaa1
那请问怎样才能把数组附空呢
2009-09-26 22:01
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
得分:0 
我输入2 40 后程序就死了。不知道……
2009-09-26 22:03
m456m654
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:783
专家分:2806
注 册:2009-9-17
得分:0 
你说的数组赋空的意思是不是,在士兵喊完一次口号后,你把原数组清空,来放剩下的士兵的?
那我觉得你可以考虑:
1, s[]=0;不过不知道对后面有没有影响,没仔细看。
2,多建立几个数组,来存放新的编号,不过比较浪费资源。
3,将原来建立的s[]由malloc函数分配出,或者是calloc函数分配,这样free()就能起作用了。
你在试试吧。
2009-09-26 22:32



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




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

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