2 lin28170323 lin28170323 于 2015.06.17 16:43 提问

C语言free问题,出现运行时错误CRT

代码如下:

# include<stdio.h>
# include <stdlib.h>
# include <string.h>
typedef struct node {
    char name[20];
    struct node * next;
}ListNode;

typedef ListNode * LinkList;

LinkList InitRing(int totalNumberOfPeople, LinkList linklist)
{
    ListNode *footer, *slider;//*footer是表尾,*slider是游标
    char name[20];
    int i;

    footer = NULL;
    linklist = slider = (ListNode *)malloc(sizeof(ListNode));
    if (linklist == NULL)
    {
        printf("内存分配错误。");
        exit(1);
    }

    getchar();

    for (i = 1;i < totalNumberOfPeople;i++)
    {
        printf("第%d个人的名字\n", i);
        scanf("%s",name);
        strcpy(slider->name, name);

        footer = (ListNode *)malloc(sizeof(LinkList));

        if (footer == NULL)
        {
            printf("内存分配错误");
            exit(1);
        }

        slider->next = footer;
        slider = footer;
    }

    printf("第%d个人的名字\n", i);
    scanf("%s",name);
    strcpy(footer->name, name);
    footer->next = linklist;
    printf("\n");

    return linklist;
}

LinkList DeleteDeath(int totalNumberOfPeople, int countOffLimits, LinkList linklist)
{
    int i, j;
    ListNode *slider, *deletePeople;

    slider = linklist;

    for (i = 1;i <= totalNumberOfPeople / 2;i++)
    {
        for (j = 1;j <= countOffLimits-2;j++)
            slider = slider->next;

        deletePeople = slider->next;
        slider->next = deletePeople->next;
        slider = slider->next;
        printf("%s ", deletePeople->name);
        if (i % 5 == 0) printf("\n");
        free(deletePeople);
    }
    printf("\n");

    return linklist;
}

void OutRing(LinkList linklist)
{
    LinkList slider;
    int i = 1;

    slider = linklist;

    do {
        printf("%s ", slider->name);
        if (i % 5 == 0) printf("\n");
        i++;
        slider = slider->next;
    } while (slider != linklist);

}

int main()
{
    int totalNumberOfPeople, countOffLimits;
    LinkList linklist = NULL;

    printf("请输入总人数:\n");
    scanf("%d", &totalNumberOfPeople);
    printf("请输入报数上限:\n");
    scanf("%d", &countOffLimits);

    linklist = InitRing(totalNumberOfPeople, linklist);//建立循环单链链表函数

    printf("出局名单如下:\n");
    linklist = DeleteDeath(totalNumberOfPeople, countOffLimits, linklist);

    printf("\n");

    printf("生存者名单如下:\n");

    OutRing(linklist);

    return 0;
}

发生运行时错误,提示CRT detected that the application wrote to memory after end of heap buffer

只要把DeleteDeath函数的free(deletePeople)删除即可。请问怎么这是什么问题,需要怎么修改?

7个回答

lin28170323
lin28170323   2015.06.17 23:35
已采纳

楼主改了malloc的大小就可以了,当然代码还是要修改一下的。
贴上修改过的代码:

 # include<stdio.h>
# include <stdlib.h>
# include <string.h>
typedef struct node {
    char name[20];
    struct node * next;
}ListNode;

typedef ListNode * LinkList;

LinkList InitRing(int totalNumberOfPeople, LinkList linklist)
{
    ListNode *footer, *slider;//*footer是表尾,*slider是游标
    char name[20];
    int i;

    footer = NULL;
    linklist = slider = (ListNode *)malloc(sizeof(ListNode));
    if (linklist == NULL)
    {
        printf("内存分配错误。");
        exit(1);
    }

    getchar();

    for (i = 1;i < totalNumberOfPeople;i++)
    {
        printf("第%d个人的名字\n", i);
        scanf("%s",name);
        strcpy(slider->name, name);

        footer = (ListNode *)malloc(sizeof(ListNode));

        if (footer == NULL)
        {
            printf("内存分配错误");
            exit(1);
        }

        slider->next = footer;
        slider = footer;
    }

    printf("第%d个人的名字\n", i);
    scanf("%s",name);
    strcpy(footer->name, name);
    footer->next = linklist;
    printf("\n");

    linklist = footer;
    return linklist;
}

LinkList DeleteDeath(int totalNumberOfPeople, int countOffLimits, LinkList linklist)
{
    int i, j;
    ListNode *slider, *deletePeople;

    slider = linklist;

    for (i = 1;i <= totalNumberOfPeople / 2;i++)
    {
        for (j = 1;j <= countOffLimits-1;j++)
            slider = slider->next;

        deletePeople = slider->next;
        slider->next = deletePeople->next;
        printf("%s ", deletePeople->name);
        if (i % 5 == 0) printf("\n");
        free(deletePeople);

    }
    printf("\n");

    return linklist;
}

void OutRing(LinkList linklist)
{
    LinkList slider;
    int i = 1;

    slider = linklist;

    do {
        printf("%s ", slider->name);
        if (i % 5 == 0) printf("\n");
        i++;
        slider = slider->next;
    } while (slider != linklist);

}

int main()
{
    int totalNumberOfPeople, countOffLimits;
    LinkList linklist = NULL;

    printf("请输入总人数:\n");
    scanf("%d", &totalNumberOfPeople);
    printf("请输入报数上限:\n");
    scanf("%d", &countOffLimits);

    linklist = InitRing(totalNumberOfPeople, linklist);//建立循环单链链表函数

    printf("出局名单如下:\n");
    linklist = DeleteDeath(totalNumberOfPeople, countOffLimits, linklist);

    printf("\n");

    printf("生存者名单如下:\n");

    OutRing(linklist);

    return 0;
}
bdmh
bdmh   Ds   Rxr 2015.06.17 16:55

free要和new配对使用,你都没有new,怎么用free

lin28170323
lin28170323 你好,我是有用malloc的。
大约 3 年之前 回复
lin28170323
lin28170323 你好,我是有用malloc的。
大约 3 年之前 回复
ycg514230
ycg514230   Rxr 2015.06.17 18:22

他有malloc的,我刚刚下载了你的代码,在VS2012里面跑没问题啊。
除非你第二个参数比第一个大,那就会崩溃。

lin28170323
lin28170323 你好,我是用vs2015社区版和codeblocks都跑不了。
大约 3 年之前 回复
lin28170323
lin28170323   2015.06.17 20:06

csdn不知道怎么回复别人,就在这里回了。

回复bdmh:你好,我是有用malloc的。

回复帘卷西风:你好,我是用vs2015社区版和codeblocks都跑不了。

frank_20080215
frank_20080215   2015.06.17 21:43

deletePeople和malloc()不在同一个函数里,超出了作用范围

lin28170323
lin28170323 free不是根据指针去找的吗?
大约 3 年之前 回复
cuiwei1026522829
cuiwei1026522829   Ds   Rxr 2015.06.18 00:25

图片说明
在我这里没有问题啊,

lin28170323
lin28170323 而且这代码其实还有点小问题,我上面贴了个修改过的。
大约 3 年之前 回复
lin28170323
lin28170323 ![图片说明](http://img.ask.csdn.net/upload/201506/18/1434589772_259147.png)
大约 3 年之前 回复
lin28170323
lin28170323 如果我不修改就是这样滴,因为在InitRing函数里给指针footer那里malloc错了。应该是sizeof(ListNode)
大约 3 年之前 回复
lin28170323
lin28170323   2015.06.18 09:11

图片说明

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于c语言内存分配,malloc,free,和段错误,内存泄露
1.   C语言的函数malloc和free  (1) 函数malloc和free在头文件中的原型及参数        void * malloc(size_t size) 动态配置内存,大小有size决定,返回值成功时为任意类型指针,失败时为NULL。        void  free(void *ptr) 释放动态申请的内存空间,调用free()后ptr所指向的
c语言编译、运行时出现错误
编译时: (1)error: array type has incomplete element type 报错一行的代码为 long long prim(int cost[][],int n,int u) 二维数组作为参数不能这样输入,应输入为 int cost[][max]; 或者 int(*)cost[]; 以下的输入同样不符合规定: int* cost[]; in
C语言中运行程序时出现错误的几种原因
1.出现了以数组长度为下标数组元素 如:int a[20];         a[20]=20;
C语言 FREE()函数注意点
C语言中,malloc, alloc, free是c定义的一组内存管理的API函数,free可以释放calloc, malloc, realloc动态分配的空间,当你调用malloc、alloc分配内存时,不仅仅是从堆里面分配得到了可用内存,实际上内存管理子系统还会维护了内存列表(你定义的普通指针不会出现这个列表中)。 而对于使用new, GlobalAlloc之类的方式分配的内存可不可以使用fr
cnstudio-495个C语言问题(free).
cnstudio-495个C语言问题(free).cnstudio-495个C语言问题(free).cnstudio-495个C语言问题(free).cnstudio-495个C语言问题(free).
C语言中频繁的malloc和free导致的free()错误
背景:网络数据处理的程序,2Gbps的流量,每个数据包都有数次malloc和free操作 经过:使用tcpreplay回放数据包进行测试,同一批数据反复回放,在15分钟左右会出现free()的错误,错误出现时间不固定,最长坚持了45分钟,由于要求程序至少要坚持1小时,所以这个错误不能接受 解决过程:仔细检查所有free的地方,确认没有野指针,也没有double free,原因无法确定 解决方
对于C语言free()函数的一些反思
上周在解决一道课后习题的时候,偶然间发现了一个自己从未注意过的问题,问题描述如下: 在遍历一个循环链表时,我发现在我调用free()函数删除了一个节点之后,仍然能用printf打印出原先的数据,起初我以为是巧合,并未加以注意。今天我又尝试free其他节点,之后仍然能够通过printf打印出原先的值,这个问题立刻引起了我的注意。下面将出现问题的代码附在下方,供各位查看: #include<stdio.
free报错问题的原因总结
前一段时候在做项目的时候碰到了运行时程序崩溃的问题,定位到了是free(p);这个语句出错误,找了半天资料解决了,现在写下一点自己的总结。   这个问题有可能是以下4个原因构成,一一排查一般都可以解决: 1 释放一个空指针,这个就不用多说了,短点调试不会也会打印吧 printf("%x",p);可以打印出16进制数         2 重复释放,这个问题也很好解决,在所有的释放语句后都赋值指
C语言中的malloc和free造成内存泄露?
      首先,说一下我对内存泄露的理解,内存泄露是指:程序中一块不再使用的内存没有被释放,造成内存保持占用状态,使操作系统不能将内存分配给其它的程序(进程)。在C语言,用的最多的管理内存的函数莫过于malloc和free了,下面我用VC6.0做了一个小测试,源码如下: #include#includeint main(){ int *pint=(int *)malloc(siz
linux下C编程free()时出现飘忽诡异的段错误(核心已转储)问题
先说一下问题现场。 代码如下 free(volthisframe->Tops); free(volthisframe->Bots); printf("what\n"); free(volthisframe->SCTops); free(volthisframe->SCBots); 运行时出现段错误,“what”随机出现,也就是说可能是打印前出现段错误,也可能是打印后出现