小白求助
#include <stdio.h>#define MAX 600000
int main(void)
{
int i,k,location;
int array = {1};
scanf("%d",&i);
if (i == 0)
printf("%d",1);
else{
for (int j = 1,m = 0;j <= i;j++){
array *= j;
while (array / 10 > 0){
array++;
if (array >= 100){
array %= 10;
array++;
}
if (array >= 10)
array %= 10;
for (k = 1;k <= MAX;k++){
while (array / 10 > 0){
array++;
array /= 10;
}
}
}
}
location = MAX;
while (array[--location] != 0)
;
for (;location >= 0;location--)
printf("%d",array);
}
return 0;
}
有大佬能解释一下为什么MAX定义为500000可以输入,而定义成600000时就会直接结束程序吗? 在这段代码中,定义了一个长度为MAX的数组array。在定义为500000时,array的长度为500000,而在定义为600000时,array的长度为600000。
由于本题中的数组是在栈上分配的,而栈的大小是有限制的。当定义为600000时,数组长度超出了栈的限制,导致程序崩溃。而定义为500000时,数组长度没有超出栈的限制,所以程序可以正常运行。
解决方法是将数组改为在堆上分配,或者使用动态数组。 在这段代码中,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()函数来动态分配内存,这样就可以避免内存不足的问题了。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页:
[1]