可能重复:
Max Array Size in C
我的问题是:Code :: blocks是否具有循环的最大迭代次数?
我正在运行蒙特卡洛,我想通过for循环运行一百万个粒子。但似乎没有崩溃的最大值是110000。
谢谢!
更多信息:
我正在使用按时间播种的随机数生成器:
srand(time(NULL));
然后我要创建一百万个粒子(随机)
for(k=0; k<M; k++){
R[k] = rand()*(1)/(double)RAND_MAX;
z[k] = -log(1 - R[k])/(1000*U);
其中M = Num / 10(我想#define N 1000000)
这是我唯一能想到的就是创造问题?
这是一个不起作用的示例代码。
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
int main(){
srand(time(NULL));
int j=0;
int i;
double A[1000000];
for(i=0;i<1000000;i++){
A[i] = rand()*(1.0)/(double)RAND_MAX;
if (A[i] == 1.0){
printf("Wow!\n");
}
}
return 0;
}
这可能是由于我对Code :: blocks的设置有任何机会吗?
答案 0 :(得分:2)
没有最大迭代次数,但堆栈大小有限制。
声明局部变量时,将从堆栈中分配内存。 A
的大小太大而无法放入堆栈中。 (例如,Windows上的典型堆栈大小为1MB,1000000 * sizeof(double)
要大得多。)
您可以尝试将A
更改为全局变量,或按malloc
分配。
答案 1 :(得分:1)
编辑:这是因为Windows上的默认最大堆栈大小为1MB(但Linux上为8MB)。
我没有最终答案,但我知道:
a)从Linux命令行运行良好。
b)Valgrind给出了这种形式的大量错误:
==2465== Invalid write of size 8
==2465== at 0x804851D: main (test2.c:16)
==2465== Address 0xbe4480e4 is on thread 1's stack
==2465==
==2465== Invalid write of size 4
==2465== at 0x8048521: main (test2.c:16)
==2465== Address 0xbe4480e0 is on thread 1's stack
==2465==
==2465== Invalid read of size 4
==2465== at 0x4081D69: printf (printf.c:35)
==2465== by 0x8048528: main (test2.c:16)
==2465== Address 0xbe4480e0 is on thread 1's stack
==2465==
==2465== Invalid read of size 8
==2465== at 0x407AC05: vfprintf (vfprintf.c:1622)
==2465== by 0x4081D7F: printf (printf.c:35)
==2465== by 0x8048528: main (test2.c:16)
==2465== Address 0xbe4480e4 is on thread 1's stack
c)错误与数组的读写错误有关。这个更简单的程序版本不会导致任何Valgrind错误:
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
int main(){
srand(time(NULL));
int i;
for(i=0;i<1000000;i++){
if (rand()*(1.0)/(double)RAND_MAX == 1.0){
printf("Wow!\n");
}
}
return 0;
}