Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        3年前关闭。
                                                                                            
                
        
为什么在最后添加printf语句时却给出运行时错误?并且在删除printf语句之后,没有错误。

#include <stdio.h>

#define MOD 1000000007
#define MAX 44721

int main() {
    long long int test, i, j, store[1000009], n, m, x, a[1000006];
    scanf("%lld", &test);
    for (i = 0; i < 1000006; i++) {
        store[i] = 1LL;
    }
    a[0] = 1;

    for (j = 1; j < 1000006; j++) {
        for (i = 1; i < MAX; i++) {
            if (i % 2 == 0) {
                store[i] = (store[i - 1] + store[i]) % MOD;
            }
        }
        a[j] = store[MAX - 1];
    }
    printf("%lld", a[1]);
    return 0;
}

最佳答案

首先,您应该选择一种语言,因为C与C ++不同。
由于您的代码是C,所以我的解决方案也将在C中。

在Valgrind cleary下运行代码表明您正在经历堆栈溢出。堆栈上的数组大小太大。

Valgrind输出:

==14228== Invalid write of size 4
==14228==    at 0x100000DC7: main (prova.c:6)
==14228==  Address 0x1038c062c is on thread 1's stack
==14228==  in frame #0, created by main (prova.c:6)


堆栈的大小取决于系统,在许多系统上,默认值是8MB,在UNIX / Linux上,您可以看到它发出commnad ulimit -a。您可能要查看此post以获得有关堆栈和堆如何工作的更多信息。

正确的解决方案是动态分配数组:

store = malloc(1000009 * sizeof(long long int));
if (store == NULL) {
  // The memory allocation failed, exit
  return(1);
}

a = malloc(1000006 * sizeof(long long int));
if (a == NULL) {
   return(1);
}


记住要始终检查malloc的返回值;)

08-16 11:38