免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1028 | 回复: 1
打印 上一主题 下一主题

谁帮帮我,我给你跪下来 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-05-29 14:56 |只看该作者 |倒序浏览
最近学vc,写了这样一段程序
// testlist.cpp : Defines the entry point for the console application.
//
#include <stdio.h>;
#include <stdlib.h>;
typedef struct ListHead
{
        struct ListHead * next,* prev;
}LIST;
#define INIT_LIST_HEAD(ptr) do{(ptr)->;next=(ptr);(ptr)->;prev=(ptr);}while(0)

#define LIST_HEAD_INIT(name) {&(name), &(name)}

//直接宏定义并初始列表
#define LIST_HEAD(name) \
        struct ListHead name = LIST_HEAD_INIT(name)

//添加新成员到prev和next之间
static inline void __list_add(struct ListHead * pnew,struct ListHead * prev,struct ListHead * next)
{
        next->;prev = pnew;
        pnew->;next = next;
        pnew->;prev = prev;
        prev->;next = pnew;
}
static inline void ListAdd(struct ListHead * pnew,struct ListHead * head)
{
        __list_add(pnew,head,head->;next);
}
static inline int ListEmpty(const struct ListHead *head)
{
        return head->;next == head;
}
static inline void __list_del(struct ListHead * prev, struct ListHead * next)
{
        next->;prev = prev;
        prev->;next = next;
}
#define        ListLast(head) ((head)->;prev)
#define        ListFirst(head) (head)
static inline int ListCount(struct ListHead * head)
{
        struct ListHead * curr=head;
        int count=0;
        while((curr=curr->;next)!=head)count++;
        return count;
}
static inline void ListDel(struct ListHead * entry)
{
        __list_del(entry->;prev,entry->;next);
}
#define ListEntry(ptr,type,member) \
        ((type *)(((char *)(ptr))-(unsigned long)(&(((type *)0)->;member))))

LIST_HEAD(Alist);

typedef struct aa
{
        LIST list;
        int i;
}AAA;
void makeaaa(int i)
{
        AAA * a=(AAA *)malloc(sizeof(AAA));
        a->;i=i;
                ListAdd(&(a->;list),&Alist);
}
void freeaaa(AAA * a)
{
        if(a)free(a);
}
int main(void)
{
        LIST * curr=&Alist;
        AAA * a=NULL;
        int j;
        makeaaa(1);
        makeaaa(2);
        makeaaa(3);
        while((curr=curr->;next)!=&Alist)
        {
        scanf("%d",&j);
        a=ListEntry(curr,AAA,list);
        printf("i=%d    curr=%x  curr->;next=%x",a->;i,curr,curr->;next);
        ListDel(curr);
        freeaaa(a);
        }
        return 0;
}

此程序在linux下完全正常,但vc编译后,发现释放第一个节点的时候破坏了链表
哪个大哥告诉我怎么回事啊,不胜感激

论坛徽章:
0
2 [报告]
发表于 2004-06-08 00:17 |只看该作者

谁帮帮我,我给你跪下来

没人理我,我顶啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP