杭电OJ出现Runtime Error (ACCESS_VIOLATION),麻烦各位前辈帮我看下原因~

leeeein 2018-03-22 09:20:00
谢谢大家~
题目是这样的

代码在下面,在编译器上可以通过,但是提交以后Judge Status会提示Runtime Error(ACCESS_VIOLATION)
不知道是不是没有释放空间的原因。麻烦大神帮忙检查一下代码,谢谢您啦!

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
double **a;
double *b;
int i,j,n,m;
int num=0;
double count=0,aver=0;
while(scanf("%d %d",&i,&j)==2)
{
b=(double *)malloc(sizeof(double)*(j+1));
a=(double **)malloc(sizeof(double *)*(i+1));
for(n=0;n<j;n++)
a[n]=(double *)malloc(sizeof(double)*(j+1));
for(n=0;n<i;n++)
{
for(m=0;m<j;m++)
scanf("%lf",&a[n][m]);
}
for(n=0;n<i;n++)
{
for(m=0;m<j;m++)
count+=a[n][m];
aver=count/j;
printf("%.1lf ",aver);
count=0;
}
printf("\n");
for(n=0;n<j;n++)
{
for(m=0;m<i;m++)
count+=a[m][n];
aver=count/i;
b[n]=aver;
printf("%.1lf ",aver);
count=0;
}
for(n=0;n<i;n++)
{
num++;
for(m=0;m<j;m++)
{
if(a[n][m]<b[m])
{
num--;
break;
}
}
}
printf("\n%d\n",num);
num=0;
aver=0;
}
return 0;
}
...全文
887 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2018-03-22
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    int i,j,n,m;
    int num = 0;
    float sum = 0, aver = 0;
    float **stu, *course_avr_list;

    while(scanf("%d %d", &m, &n) == 2)
    {
        course_avr_list = (float *)malloc(sizeof(float) * n);
        if (!course_avr_list)
            exit(0);
        stu = (float **)malloc(sizeof(float *) * m);
        if (!stu)
            exit(0);
        for(i = 0; i < n; i++) {
            stu[i] = (float *)malloc(sizeof(float)*(n + 1));
            if (!stu[i])
                exit(0);
            course_avr_list[i] = 0;
        }
        for(i = 0; i < m; i++)
        {
            for(j = 0; j < n; j++) {
                scanf("%f", &stu[i][j]);
                sum += stu[i][j];
                course_avr_list[j] += stu[i][j];
            }
            aver = sum / m;
            stu[i][n] = aver;
            sum = 0;
        }
        for (i = 0; i < m; i++)
            printf("%.2f\t", stu[i][n]);
        printf("\n");

        for (j = 0; j < n; j++) {
            course_avr_list[j] /= n;
            printf("%.2f\t", course_avr_list[j]);
        }
        printf("\n");

        for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++)
                if (stu[i][j] < course_avr_list[j])
                    break;
            if (j >= n)
                num++;
        }
        printf("\n%d\n",num);
        num = 0;
        for (i = 0; i < n; i++)
            free(stu[i]);
        free(stu);
        free(course_avr_list);

    }
    return 0;
}
参考一下吧 对于学生成绩,不建议是用double类型,因为float类型完全能够表示,double比float多占内存空间; 建议减少循环次数,能将循环次数合并的则合并,循环次数增加会导致时间复杂度高,也一定原因上会加剧running time。 malloc需要多少就申请多少,没必要都要多申请一个。 malloc申请的空间需要手动释放,因此使用完之后要记着释放。如果有多次测试数据,那么若不释放会导致内存泄露。
zgl7903 2018-03-22
  • 打赏
  • 举报
回复
a=(double **)malloc(sizeof(double *)*(i+1)); for(n=0;n<j;n++) a[n] = 上面分配了 i+1个指针单元, 下面0~j, 当j大于i+1时,下面就越界了 输入的参数应先做判断是否合法, 比如上面输入负数会出什么问题? 分配的缓冲区应及时清理 变量最好是起个比较知意的名字, 这样不容易出错 后面的自己慢慢分析吧 还有
leeeein 2018-03-22
  • 打赏
  • 举报
回复
对了,分配内存那里,一开始写的分配的大小都是i个和j个,后来实在找不出问题乱改就试了试多分配一个...
内容概要:本文围绕“粒子群优化算法驱动的永磁同步电机电流环多参数协同辨识研究”,提出一种基于Simulink仿真实现的高精度参数辨识方法,旨在解决永磁同步电机(PMSM)在高性能电流控制中因关键参数(如电感、电阻、永磁磁链等)不准确或时变所导致的控制性能下降问题。研究构建了PMSM的精确数学模型,并在Simulink环境中搭建完整的电流环控制系统仿真平台,创新性地引入粒子群优化算法(PSO)对多个关键参数进行在线或多工况下的协同辨识。文中详细阐述了PSO算法的核心机制、适应度函数的设计原则(通常基于模型输出与实际响应的误差最小化)、参数初始化与收敛判据,并通过大量仿真实验验证了该方法在不同负载和运行条件下的辨识精度、收敛速度与强鲁棒性,有效提升了电流环的动态响应能力、抗干扰性和整体控制系统的稳定性。; 适合人群:具备电机控制理论、现代智能优化算法基础及MATLAB/Simulink仿真能力,从事电气工程、自动化控制、新能源汽车电驱动系统等领域的高校研究生、科研人员及企业研发工程师。; 使用场景及目标:①应用于高精度伺服驱动、电动汽车电驱系统等对电机参数敏感的高端装备中,实现控制器的精细化标定与自适应;②为智能优化算法在复杂非线性系统参数辨识领域的工程应用提供完整的仿真案例和技术范本;③服务于电机控制系统的故障诊断、性能评估及下一代自整定控制器的研发。; 阅读建议:建议读者结合提供的Simulink模型与MATLAB代码进行动手实践,重点剖析PSO算法与电机模型的耦合机制,深入理解适应度函数的构建逻辑,并可进一步尝试将该方法拓展至温度补偿、磁饱和等非线性因素的联合辨识,或迁移至其他类型的电机(如感应电机)控制中,以深化对数据驱动与模型驱动融合控制策略的理解。

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧