鱼C论坛

 找回密码
 立即注册
查看: 1301|回复: 2

[已解决]小白求助

[复制链接]
发表于 2023-11-5 21:47:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#define MAX 600000
int main(void)
{
        int i,k,location;
        int array[MAX] = {1};
       
        scanf("%d",&i);
        if (i == 0)
                printf("%d",1);
        else{
                for (int j = 1,m = 0;j <= i;j++){
                        array[m] *= j;
               
                while (array[m] / 10 > 0){
                        array[m+1]++;
                        if (array[m] >= 100){
                                array[m] %= 10;
                                array[m+1]++;
                        }
                        if (array[m] >= 10)
                                array[m] %= 10;
                        for (k = 1;k <= MAX;k++){
                                while (array[k] / 10 > 0){
                                        array[k+1]++;
                                        array[k] /= 10;
                                        }
                                }
                        }
                }
                location = MAX;
                while (array[--location] != 0)
                        ;
                for (;location >= 0;location--)
                        printf("%d",array[location]);
        }
       
        return 0;
}
有大佬能解释一下为什么MAX定义为500000可以输入,而定义成600000时就会直接结束程序吗?
最佳答案
2023-11-5 21:48:57
在这段代码中,MAX被定义为一个宏,它用来表示数组array的最大长度。在这个例子中,我们需要使用一个比较大的数组来存储阶乘的结果,因此需要定义一个足够大的MAX

答案:

问题:为什么MAX定义为500000可以输入,而定义成600000时就会直接结束程序?

MAX被定义为500000时,array数组的大小为500000,占用的内存空间为4*500000=2000000字节,即2MB。而在大多数操作系统中,一个进程可以使用的虚拟地址空间是有限制的,通常只有几GB到几十GB不等。当我们申请内存超过进程可用地址空间的时候,程序就会异常终止。

MAX被定义为600000时,array数组的大小为600000,占用的内存空间为4*600000=2400000字节,即2.4MB,这已经超过了部分操作系统默认的可用地址空间大小,因此程序会直接结束。

解决这个问题的方法是使用动态内存分配,例如使用malloc()函数来动态分配内存,这样就可以避免内存不足的问题了。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-5 21:48:00 | 显示全部楼层
在这段代码中,定义了一个长度为MAX的数组array。在定义为500000时,array的长度为500000,而在定义为600000时,array的长度为600000。

由于本题中的数组是在栈上分配的,而栈的大小是有限制的。当定义为600000时,数组长度超出了栈的限制,导致程序崩溃。而定义为500000时,数组长度没有超出栈的限制,所以程序可以正常运行。

解决方法是将数组改为在堆上分配,或者使用动态数组。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-5 21:48:57 | 显示全部楼层    本楼为最佳答案   
在这段代码中,MAX被定义为一个宏,它用来表示数组array的最大长度。在这个例子中,我们需要使用一个比较大的数组来存储阶乘的结果,因此需要定义一个足够大的MAX

答案:

问题:为什么MAX定义为500000可以输入,而定义成600000时就会直接结束程序?

MAX被定义为500000时,array数组的大小为500000,占用的内存空间为4*500000=2000000字节,即2MB。而在大多数操作系统中,一个进程可以使用的虚拟地址空间是有限制的,通常只有几GB到几十GB不等。当我们申请内存超过进程可用地址空间的时候,程序就会异常终止。

MAX被定义为600000时,array数组的大小为600000,占用的内存空间为4*600000=2400000字节,即2.4MB,这已经超过了部分操作系统默认的可用地址空间大小,因此程序会直接结束。

解决这个问题的方法是使用动态内存分配,例如使用malloc()函数来动态分配内存,这样就可以避免内存不足的问题了。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 23:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表