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 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100