您的位置:首页 > 编程语言 > C语言/C++

C语言建立单链表出错误及其分析

2014-11-13 17:24 232 查看
 

# include <stdio.h>

# include <stdlib.h>

# include <time.h>

struct chain

{

        int value1;

        int value2;

        struct chain *next;

};

struct chain *create()

{

        struct chain *head,*tail,*p;

        int i,n,x;

        int  y;

        printf("Enter a number n : ");

        scanf("%i",&n);

        srand((unsigned)time(NULL));

        head = tail = NULL;

        p = (struct chain *)malloc(sizeof(struct chain));

        p->next =NULL;

        for (i=0;i<=n;i++)

        {

                x= rand()%100+1;

                y = rand()%10 +1;

                p->value1 = x;

                p->value2 = y;

                if (head == NULL)

                        head = tail =p;

                else

                        tail = tail->next;

                tail->next =p;

        }

        return head;

}

int main (void)

{

        struct chain *p,*q;

        q = create();

        while (q)

        {

                printf("%4iand%4i",q->value1,q->value2);

                p = q->next;

                free(q);

                q =p;

        }

        printf("\n");

return 0;

}

 

[root@localhost Gcc]# ./a.out

Enter a number n : 5

*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x0000000001663010 ***

======= Backtrace: =========

/lib64/libc.so.6(+0x76166)[0x7fd090783166]

./a.out[0x400859]

/lib64/libc.so.6(__libc_start_main+0xfd)[0x7fd09072bd1d]

./a.out[0x400619]

======= Memory map: ========

00400000-00401000 r-xp 00000000 fd:00 654092                             /root/Gcc/a.out

00600000-00601000 rw-p 00000000 fd:00 654092                             /root/Gcc/a.out

01663000-01684000 rw-p 00000000 00:00 0                                  [heap]

7fd0904f7000-7fd09050d000 r-xp 00000000 fd:00 130818                     /lib64/libgcc_s-4.4.7-20120601.so.1

7fd09050d000-7fd09070c000 ---p 00016000 fd:00 130818                     /lib64/libgcc_s-4.4.7-20120601.so.1

7fd09070c000-7fd09070d000 rw-p 00015000 fd:00 130818                     /lib64/libgcc_s-4.4.7-20120601.so.1

7fd09070d000-7fd090898000 r-xp 00000000 fd:00 130831                     /lib64/libc-2.12.so

7fd090898000-7fd090a97000 ---p 0018b000 fd:00 130831                     /lib64/libc-2.12.so

7fd090a97000-7fd090a9b000 r--p 0018a000 fd:00 130831                     /lib64/libc-2.12.so

7fd090a9b000-7fd090a9c000 rw-p 0018e000 fd:00 130831                     /lib64/libc-2.12.so

7fd090a9c000-7fd090aa1000 rw-p 00000000 00:00 0

7fd090aa1000-7fd090ac1000 r-xp 00000000 fd:00 130824                     /lib64/ld-2.12.so

7fd090cb6000-7fd090cb9000 rw-p 00000000 00:00 0

7fd090cbc000-7fd090cc0000 rw-p 00000000 00:00 0

7fd090cc0000-7fd090cc1000 r--p 0001f000 fd:00 130824                     /lib64/ld-2.12.so

7fd090cc1000-7fd090cc2000 rw-p 00020000 fd:00 130824                     /lib64/ld-2.12.so

7fd090cc2000-7fd090cc3000 rw-p 00000000 00:00 0

7fff63efe000-7fff63f13000 rw-p 00000000 00:00 0                          [stack]

7fff63f6a000-7fff63f6b000 r-xp 00000000 00:00 0                          [vdso]

ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

   77and   8   0and   0Aborted

 

错误原因在于p节点的生成与p->value 赋值的位置,应该放在for循环内部,表示没循环一次就必须有内存分配一个节点地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: