sol21 2017-05-02 15:46 采纳率: 80%
浏览 1001
已采纳

关于C语言动态二维数组的问题,希望有人可以帮帮忙

不好意思打扰一下各位。今天实验课的有个设计我想用动态二维数组做,但是不知道为什么,比如2位同学2个科目就能顺利运行,其他稍微大一点的数据运行可以正常但往往容易运行到一半程序崩溃这是为什么呢
我检查了一下我想应该是没有溢出的?
源码如下,恳请诸位解惑,谢谢啦

#include
#include
void sum(int i,int n,int p,int *t,int **a);
void main( )
{

int max=0,min=1000;
int m,n,i,x=0;
int *p=0,*t=0;
p=&max;
t=&min;
printf("请输入学生数和科目数 (中间以空格隔开):");
scanf("%d%d",&m,&n);
int **a=0;
a = (int
*)malloc(sizeof(int*)*m);
for (x= 0; x <=n; x++)
a[x] = (int*)malloc(sizeof(int)*n);
printf("输入%d个学生的%d门课的成绩\n",m,n);
while (i<=m-1)
{
printf("现在请输入第%d个学生的成绩 (四门成绩中间以空格隔开):",i+1);

    for (x=0;x<=n-1;x++)
    scanf("%d",&a[i][x]);

    sum(i,n,p,t,a);
    i++;
    }
    printf("最高分为%d,最低分为%d",max,min); 
    free(a);

}
void sum(int i,int n,int *p,int *t,int **a)
{
int x,s=0;

for (x=0;x<=n-1;x++)
s=s+a[i][x];
if (s>=*p)
*p=s;
if (s<*t)
*t=s;
}

  • 写回答

3条回答 默认 最新

  • sol21 2017-05-03 09:16
    关注

    问题已经在楼上的提醒下顺利解决,非常感谢大家的帮助。
    第一个问题是,第二维的分配长度。
    for (x=0;x<=m;x++)
    a = (int*)malloc(sizeof(int)*n);
    改成这样就可以了。

    第二个问题是,指针越界。
    因为while循环结束时i=6,第一维长度是5。
    所以改成a = (int**)malloc(sizeof(int*)*(m+1));

    第三个问题是,内存释放顺序。
    需要先释放列再释放行,顺序反了会把列的地址擦除找不到地址导致崩溃。
    所以改成
    for (x=0;x<=n;x++)
    free(a[x]);
    free(a);

    再一次感谢大家的帮助,谢谢。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog