鱼C论坛

 找回密码
 立即注册
查看: 1363|回复: 7

为什么出现m=1之后运行会出错

[复制链接]
发表于 2015-6-26 14:15:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 剑客夜帝 于 2015-6-26 15:06 编辑

#include<stdio.h>
#include<stdlib.h>
int i=1;
typedef struct Node
{
        int data;
        struct Node *next;
}node;
node *create()
{
        node *head=NULL,*p;
        head=(node *)malloc(sizeof(node));
        p=head;
        printf("请输入每个人手里的数字,如果小于1,那么结束输入,那个人不作数。\n");
        printf("请输入第%d个人手里的数字:",i);
        scanf("%d",&p->data);
        node *s,*p1;
        while(p->data > 0)
        {
                s=(node *)malloc(sizeof(node));
                printf("请输入第%d个人手里的数字:",(++i));
                scanf("%d",&s->data);
                p->next=s;
                p1=p;
                p=s;
        }
        p1->next=head;
        return (head);
}
int main()
{
        int j;
        int m;
        node *temp;
        node *p=create();
        printf("开始人选一个正整数作为第一次报数上限:");
        scanf("%d",&m);
        while(p != p->next)
        {
                if(m == 1)
                {
                        printf("%d->",p->data);
                        temp=p;
                        m=temp->data;
                        p=p->next;
                        free(temp);
                       
                }
                else
                {
                        for(j=1;j<m-1;j++)
                                p=p->next;
                        printf("%d->",p->next->data);
                        temp=p->next;
                        p->next=temp->next;
                        m=temp->data;
                        free(temp);
                        p=p->next;
                }
        }
        printf("%d\n",p->data);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-7-2 22:33:00 | 显示全部楼层
free(temp);这句有点问题,你temp没有通过malloc在堆中分配内存,你free它应该会当掉程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-9 16:27:47 | 显示全部楼层
liveloo 发表于 2015-7-2 22:33
free(temp);这句有点问题,你temp没有通过malloc在堆中分配内存,你free它应该会当掉程序

但是如果输入的数据没有1就不会出现问题,这是什么原因?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-13 21:43:49 | 显示全部楼层
输入的数据没有1就不会进入if(m==1)语句,进入的是else语句
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-13 21:48:52 | 显示全部楼层
总感觉你的内存分配有问题,光分配,不释放,malloc了谁,应该free谁,你的没对应上,可能在else中,刚好temp指向的地址等于malloc的地址,虽然不出错,但是这种情况不推荐
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-14 13:34:05 | 显示全部楼层
liveloo 发表于 2015-7-13 21:43
输入的数据没有1就不会进入if(m==1)语句,进入的是else语句

如果把P释放了会出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-15 16:43:15 | 显示全部楼层
head=(node *)malloc(sizeof(node));
要对应释放head
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-16 08:44:40 | 显示全部楼层
liveloo 发表于 2015-7-15 16:43
head=(node *)malloc(sizeof(node));
要对应释放head

把head释放了,那么第一个数据不是就没有了,能不能帮我改一下,我就是实现小甲鱼讲约瑟夫问题时布置的课后作业,看他们出列的顺序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 03:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表