| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 594 人关注过本帖
标题:关于链表死循环
只看楼主 加入收藏
gold244
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2015-3-12
结帖率:0
收藏
已结贴  问题点数:20 回复次数:8 
关于链表死循环
//新建了一个链表,但是为什么一直在死循环中。
#include<stdio.h>
#include<stdlib.h>
typedef struct position
{
    int n;
    struct position *next;
}pos;
char pos_num[15];
void Print_Link(pos *head)
{
    pos *last;
    printf("\n%d\t%d\n",&head,&(head->next));
    getchar();
    last=head->next;
    getchar();
    printf("%d\t%d\t%d\n",&(head),&(head->next),&(last));
    while(last)
    {
        printf("%d\t",last->n);//由于p和last的地址一直没有变动过,所以此处是死循环。
        last=last->next;
    }
    printf("\n");
}
void Creat_Link(pos *head);
main()
{
    int num=30;
    pos *head;
    Creat_Link(head);
    Print_Link(head);
}
void Creat_Link(pos *head)
{
    char i;
    pos *p=NULL,*last=NULL;
    head=(pos *)malloc(sizeof(pos));
    head->next=NULL;
    last=head;
    for(i=0;i<30;i++)
    {
        free(p);
        p=(pos *)malloc(sizeof(pos));
        p->n=i+1;
        printf("%d\t%d\t%d\n",p->n,&p,&(last));//这里建立的链表,打印出的地址字符显示p的位置和last的位置一直没变动过
        last->next=p;//但为什么会没有变动?
        last=p;
    }
    last->next=NULL;
}
搜索更多相关主题的帖子: position include 新建 
2015-03-12 10:02
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:10 
你都已经free(p)了,还用指针指着它干啥?简单点说,p的那块内存已经回收了,然后你再要分配新的内存,之前那块回收的内存又被你分配到了,然后p的指针当然不会变。
把free(p)去掉。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2015-03-12 13:54
gold244
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2015-3-12
收藏
得分:0 
回复 2楼 waterstar
还是不对,本来就没有free(p),因为一直显示在同一块内存操作,所以加上这句的,但最后还是死循环。
2015-03-12 13:58
dreamofgod
Rank: 5Rank: 5
等 级:职业侠客
帖 子:194
专家分:341
注 册:2011-8-16
收藏
得分:10 
回复 2楼 waterstar
p是中间变量,释放掉不影响

一个单片机就让我头疼不已~~~
2015-03-13 16:15
dreamofgod
Rank: 5Rank: 5
等 级:职业侠客
帖 子:194
专家分:341
注 册:2011-8-16
收藏
得分:0 
回复 2楼 waterstar
sorry!free确实是出问题了!

一个单片机就让我头疼不已~~~
2015-03-13 16:23
dreamofgod
Rank: 5Rank: 5
等 级:职业侠客
帖 子:194
专家分:341
注 册:2011-8-16
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct position
{
    int n;
    struct position *next;
}pos;
char pos_num[15];
void Print_Link(pos *head)
{
    pos *last;
    printf("Print_Link");
    printf("\n%d\t%d\n", &head, &(head->next));
    //getchar();
    last = head->next;
    //getchar();
    printf("%d\t%d\t%d\n", &(head), &(head->next), &(last));
    while (last != NULL)
    {
        printf("%d\t", last->n);//由于p和last的地址一直没有变动过,所以此处是死循环。
        last = last->next;
    }
    printf("\n");
}
void Creat_Link(pos *head);
main()
{
    int num = 30;
    pos head;
    Creat_Link(&head);
    Print_Link(&head);
    system("pause");
}
void Creat_Link(pos * head)
{
    char i;
    pos *p = NULL, *last = NULL;
    //head = (pos *)malloc(sizeof(pos));
    head->next = NULL;
    last = head;
    for (i = 0; i < 30; i++)
    {
        //free(p);
        p = (pos *)malloc(sizeof(pos));
        printf("%d\n", p);
        p->n = i + 1;
        printf("%d\t%d\t%d\n", p->n, &p, &(last));//这里建立的链表,打印出的地址字符显示p的位置和last的位置一直没变动过
        last->next = p;//但为什么会没有变动?
        last = p;
    }
    last->next = NULL;
}

一个单片机就让我头疼不已~~~
2015-03-13 16:46
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
我终于知道为什么会不变了
注意看
 printf("%d\t%d\t%d\n", p->n, &p, &(last));//这里建立的链表,打印出的地址字符显示p的位置和last的位置一直没变动过
你输出的是指针变量p的内存地址而不是指针变量p的值,p一直是在函数中存在的,除非出了这函数,否则其地址永不会变

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2015-03-13 16:55
dreamofgod
Rank: 5Rank: 5
等 级:职业侠客
帖 子:194
专家分:341
注 册:2011-8-16
收藏
得分:0 
回复 7楼 waterstar
p = (pos *)malloc(sizeof(pos));

p的每次for都会得到新pos的地址

一个单片机就让我头疼不已~~~
2015-03-13 19:53
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
回复 8楼 dreamofgod
p的值会变,但是&p的值是不变的,你看它输出了吗,输出的是&p好不,是取的p的内存地址输出的,不是p的值输出

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2015-03-18 16:03
快速回复:关于链表死循环
数据加载中...
 
   



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

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