0

可能重复:
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 设置造成的吗?

4

2 回答 2

2

没有最大迭代次数,但堆栈大小有限制。

当你声明一个局部变量时,内存是从堆栈中分配的。的大小A太大,无法放入堆栈。(例如,Windows 上的典型堆栈大小为 1MB,1000000 * sizeof(double)要大得多。)

您可以尝试更改A为全局变量或通过malloc.

于 2012-11-22T18:16:22.213 回答
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;
}
于 2012-11-22T17:52:06.723 回答