- 论坛徽章:
- 0
|
最近学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编译后,发现释放第一个节点的时候破坏了链表
哪个大哥告诉我怎么回事啊,不胜感激 |
|