残荷听雨77 2024-11-10 22:15 采纳率: 0%
浏览 537
已结题

使用malloc函数编译器报错 "corrupted top size"

在写一个学生信息管理系统时用到了动态数组,输入学生个数,再输入每个学生的信息,最后将所有学生排名后输出,但是运行时在我输入学生信息之后命令行提示:

img

我检查了指针和动态数组的使用,并没有发现指针超出malloc分配的内存的情况,请问一下为什么会出现这个问题啊?
以下是C语言代码:

#include <stdio.h>
#include <stdlib.h>

struct student {
    int num;
    char name[10];
    int math;
    int eng;
    int chi;
    int sum;
    int rank;
};
//定义一个学生信息结构体

void input(int *p) {
    scanf("%d", p);
    getchar();
}
//输入学生个数
void input_info(struct student *p, int len) {
    for (int i = 0; i < len; i++) {
        scanf("%d %s %d %d %d", &(p[i].num), p[i].name, &(p[i].math), &(p[i].eng), &(p[i].chi));
        getchar();
    }
}
//输入学生信息

void sum(struct student *p, int len) {
    for (int i = 0; i < len; i++) {
        p[i].sum = p[i].math + p[i].eng + p[i].chi;
    }
}
//将学生各科成绩相加得到总分

void swap(struct student *p1, struct student *p2) {
    struct student temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}
void sort(struct student *p, int len) {
    for (int i = 0; i < len; i++) {
        for (int j = 0; j < len; j++) {
            if (p[j+1].sum < p[j].sum) {
                swap(p+j+1, p+j);
            }
            else if ((*(p+j+1)).sum == (*(p+j)).sum) {
                if (p[j+1].num < p[j].num) {
                    swap(p+j+1, p+j);
                }
            }
        }
    }
}
//根据总分和学号递增排序
void rank(struct student *p, int len) {
    int count = 0;
    for (int i = 1; count < len-1; count++) {
        p[len-count-1].rank = i;
        if (p[len-count-2].sum != p[len-count-1].sum) {
            i += 1;
        }
    }
}
//给每一位学生排名

void print(struct student *p, int len) {
    for (int i = 0; i < len; i++) {
        printf("%4d%10d%10s%5d%5d%5d\n", p[i].rank, p[i].num, p[i].name, p[i].math, p[i].chi, p[i].eng);
    }
}
//输出结果

int main() {
    int *len = (int *)malloc(sizeof(int));
    input(len);
    if (*len >= 10) {
        printf("Please input 1-9.");
        return 0;
    }
    struct student *info = (struct student *)malloc((*len) * sizeof(struct student));
    input_info(info, *len);
    sum(info, *len);
    sort(info, *len);
    rank(info, *len);
    print(info, *len);
    free(len);
    free(info);
    return 0;
}
  • 写回答

1条回答 默认 最新

  • 无疆76 2024-11-10 22:16
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    这个问题可能是由于内存分配的问题导致的。在您的代码中,您使用了 malloc 函数来动态分配内存给 leninfo。如果在之前的代码中已经对这两个变量进行了内存分配并释放了内存,那么在接下来的代码中再次使用 malloc 分配内存可能会导致内存管理混乱,从而产生您遇到的问题。下面是一些可能的解决方案:

    1. 确保在使用 malloc 为变量分配内存之前,检查该变量是否已经分配了内存。如果已经分配了内存,请使用 free 函数释放内存后再重新分配。
    2. 检查是否有其他地方的代码错误导致内存泄漏或内存损坏。例如,确保在使用动态分配的数组时,不要超出其分配的内存范围进行访问或修改。另外,在调用 scanf 等函数读取输入时,使用 getchar() 来消耗输入缓冲区中的换行符可能不是一个好的做法,因为它可能导致意外的行为。您可以尝试使用循环来读取并丢弃缓冲区中的所有换行符,直到读取到下一个有效的输入为止。

    针对您的代码,以下是一些修改建议:

    1. 确保在调用 malloc 之前没有为 leninfo 分配过内存。在您的代码中,您已经在 main 函数中为 len 分配了内存,所以不需要再次分配。您可以简化这部分代码:
    int len; // 不需要使用动态内存分配来存储学生个数
    input(&len);
    if (len >= 10) {
        printf("Please input 1-9.");
        return 0;
    }
    struct student *info = (struct student *)malloc(len * sizeof(struct student));
    
    1. 在读取输入时,使用循环来处理输入缓冲区中的换行符,以避免潜在的问题。您可以使用 fgets 函数来读取一行输入,然后使用 sscanf 函数解析输入数据。这样可以更好地控制输入过程并避免意外的行为。

    请注意,这些修改只是针对您提供的代码片段进行的建议。在实际的项目中,还需要考虑其他因素,如错误处理、边界检查等。此外,如果问题仍然存在,可能需要更深入地检查代码中的其他部分以确定问题的根本原因。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月10日
  • 创建了问题 11月10日