Lamaaa 2015-06-17 08:43 采纳率: 100%
浏览 2348
已采纳

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条回答 默认 最新

  • Lamaaa 2015-06-17 15: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;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择