| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 566 人关注过本帖
标题:自己编了2个程序,编译通过,执行却报错,为什么?
只看楼主 加入收藏
atemouse
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2009-11-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
自己编了2个程序,编译通过,执行却报错,为什么?
第一个程序:
#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);
}
问题和第一个问题相同,也是报错。请教高手这个是哪里出问题了呢?
搜索更多相关主题的帖子: 编译 
2010-04-13 23:03
judking
Rank: 2
等 级:论坛游民
帖 子:13
专家分:10
注 册:2010-3-30
收藏
得分:5 
两个错是一样的~你开1000大的数组~下标最大为999~第一题下标最大为9~在你第一个循环里m[10-i]就成m[10]了~
2010-04-13 23:16
china_qk
Rank: 1
等 级:新手上路
帖 子:4
专家分:1
注 册:2010-4-11
收藏
得分:0 
同意楼上!atemouse同学怎么还在用C语言里面的东西,用C++来写也许更好。
2010-04-14 00:58
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
收藏
得分:0 
同意楼上,数组越界了,这很危险.
还有第一个程序中的自定义函数中的数组的生存期在自定义函数运行完后就自动消失了,所以应该实现两个函数共用一个数组空间.

南国利剑
2010-04-14 11:16
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
收藏
得分:5 
申请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);
}

南国利剑
2010-04-14 12:55
指冷玉笙寒
Rank: 2
等 级:论坛游民
帖 子:5
专家分:11
注 册:2010-4-14
收藏
得分:10 
先说第一个程序,如果你申请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);
2010-04-14 20:08
快速回复:自己编了2个程序,编译通过,执行却报错,为什么?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011379 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved