注册 登录
编程论坛 C++教室

自己编了2个程序,编译通过,执行却报错,为什么?

atemouse 发布于 2010-04-13 23:03, 566 次点击
第一个程序:
#include <stdio.h>
#include <malloc.h>
int sort(int *p)
{
   int *m=(int *)malloc(10);
   for(int i=0;i<10;i++)
   {m[10-i]=p[i];
   }
   return m[10];
}
void main()
{int q[]={1,2,3,4,5,6,7,8,9,0};
 int n[10];
n[10]=sort(q);
    printf("%d\n",n);
}
我的目的就是要将这个数组逆序排列,通过编译,执行后window报错
第二个程序:
#include <stdio.h>
#include <malloc.h>
void main()
{
    int *p=(int *)malloc(1000);
    int n=0;
    for(int i=1;i<=1000;i++)
    {    for(int k=1;k<=i;k++)
    {if((i%k==0)&&(k!=1)&&(k!=i))
               p[n]=i;
                n=n+1;
    }
    }
   
    printf("%d\n",p);
}
问题和第一个问题相同,也是报错。请教高手这个是哪里出问题了呢?
5 回复
#2
judking2010-04-13 23:16
两个错是一样的~你开1000大的数组~下标最大为999~第一题下标最大为9~在你第一个循环里m[10-i]就成m[10]了~
#3
china_qk2010-04-14 00:58
同意楼上!atemouse同学怎么还在用C语言里面的东西,用C++来写也许更好。
#4
南国利剑2010-04-14 11:16
同意楼上,数组越界了,这很危险.
还有第一个程序中的自定义函数中的数组的生存期在自定义函数运行完后就自动消失了,所以应该实现两个函数共用一个数组空间.
#5
南国利剑2010-04-14 12:55
申请1000个字节,实际上只是250个元素的int数组,所以,数组下标不能超过249.
我将程序2改写成下面的形式,编译和链接都通过了,但是运行时出错了,请各位高手指教。
代码如下:

#include <stdio.h>
#include <malloc.h>

void main()
{
    int *p=(int *)malloc(1000);
    int n=0;
    for(int i=1;i<=1000;i++)
    {   
        for(int k=1;k<=i;k++)
            if((i%k==0)&&(k!=1)&&(k!=i))
                {p[n]=i;n++;}
    }
   
    printf("%d\n",n);
}
#6
指冷玉笙寒2010-04-14 20:08
先说第一个程序,如果你申请10个元素的数组,引用只能a[0....9],也就是说你数组赿界使用了,即使不报错,得到的也是乱七八糟的东西。
再说第二个问题
for(int i=1;i<=1000;i++)
    {    for(int k=1;k<=i;k++)
    {if((i%k==0)&&(k!=1)&&(k!=i))
               p[n]=i;
                n=n+1;
    }
不管满足不满足if中的条件,流程都要执行n=n+1这个语句,所以,你所申请的空间很快就被“耗尽”,虽然大多数是空白。并且malloc一般不这样使用,这样使用很不安全,如果内存申请失败,连报错都没有。1000/4=250个int 整数。而不是你期望的1000个, 建义的写法是 if((p=(int*)malloc(1000*sizeof(int)))==NULL)  exit (OVERFLOW);
1