杭电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;
}
...全文
745 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个,后来实在找不出问题乱改就试了试多分配一个...

69,371

社区成员

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

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