sol21
sol21
采纳率80%
2017-05-02 15:46 阅读 969
已采纳

关于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 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);

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

    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2017-05-02 15:49

    a = (int*)malloc(sizeof(int*)*m);
    ->
    a = (int**)malloc(sizeof(int*)*m);

    点赞 评论 复制链接分享
  • zhangdian zhangdian 2017-05-02 16:06

    你这程序里内存泄露,free(a)那里,也就是说指针越界。如果你用指针链表可能会清晰些。没调你的程序,只是凭经验看,说的不对的话请见谅。

    点赞 评论 复制链接分享

相关推荐