C 二维数组太大导致分割错误

C 二维数组太大导致分割错误,c,multidimensional-array,segmentation-fault,C,Multidimensional Array,Segmentation Fault,我在下面列出了代码。如果我定义的ARR_SIZE太多(例如820),我会得到一个分段错误。但是如果ARR_SIZE不是那么大(例如320),代码就可以工作 GDB仅在int main()中显示错误 我认为问题在二维数组的初始化阶段,但不确定 #include "stdio.h" #include "time.h" #include "stdint.h" #define ARR_SIZE 820 #define TICK(X) clock_t X = clock() #define TOCK(

我在下面列出了代码。如果我定义的
ARR_SIZE
太多(例如820),我会得到一个分段错误。但是如果
ARR_SIZE
不是那么大(例如320),代码就可以工作

GDB仅在
int main()
中显示错误

我认为问题在二维数组的初始化阶段,但不确定

#include "stdio.h"
#include "time.h"
#include "stdint.h"


#define ARR_SIZE 820
#define TICK(X) clock_t X = clock()
#define TOCK(X) printf("time %s: %g sec.\n", (#X), (double)(clock() - (X)) / CLOCKS_PER_SEC)

void copyji(int src[ARR_SIZE][ARR_SIZE], int dst[ARR_SIZE][ARR_SIZE]){
    int i, j;
    for (j = 0; j < ARR_SIZE; j++)
        for (i = 0; i < ARR_SIZE; i++)
            dst[i][j] = src[i][j];
}

void copyij(int src[ARR_SIZE][ARR_SIZE], int dst[ARR_SIZE][ARR_SIZE]){
    int i, j;
    for (i = 0; i < ARR_SIZE; i++)
            for (j = 0; j < ARR_SIZE; j++)
                dst[i][j] = src[i][j];
}


int main(){
    int srcArr1[ARR_SIZE][ARR_SIZE];
    int srcArr2[ARR_SIZE][ARR_SIZE];
    int dstArr1[ARR_SIZE][ARR_SIZE];
    int dstArr2[ARR_SIZE][ARR_SIZE];
    int i, j;
    for (i = 0; i < ARR_SIZE; i++)
        for (j = 0; j < ARR_SIZE; j++){
            srcArr1[i][j] = i - j;
            srcArr2[i][j] = j - i;
        }

    TICK(TIME_JI);
    copyji(srcArr1, dstArr1);
    TOCK(TIME_JI);

    TICK(TIME_IJ);
    copyij(srcArr2, dstArr2);
    TOCK(TIME_IJ);


    return 1;
}
#包括“stdio.h”
#包括“time.h”
#包括“stdint.h”
#定义ARR_尺寸820
#定义刻度(X)时钟\u t X=时钟()
#定义TOCK(X)printf(“时间%s:%g秒。\n”,(#X),(双精度)(时钟()-(X))/CLOCKS_/秒)
无效复制(int src[ARR_SIZE][ARR_SIZE],int dst[ARR_SIZE][ARR_SIZE]){
int i,j;
对于(j=0;j
您之所以会遇到此错误,是因为您的代码会导致较大数组(如820)的堆栈溢出,而较小数组的堆栈溢出则不会。您可以使用malloc声明数组

使用malloc的示例:

int **srcArr1 = (int **)malloc(ARR_SIZE * sizeof(int *));
for (i=0; i<ARR_SIZE; i++) 
         srcArr1[i] = (int *)malloc(ARR_SIZE * sizeof(int));
int**srcArr1=(int**)malloc(ARR_SIZE*sizeof(int*);

对于(i=0;所有数组都放置在
main
的堆栈框架中的程序堆栈上。如果不发出某种系统调用来扩展它,您可以拥有的堆栈空间有限(例如8MB)。将数组放在全局/文件范围内,此限制将被删除。您使用的堆栈太多,无法按值将参数传递给函数
copyij
!必须按引用(指针)传递参数或者您必须使用全局变量。@SirJoBlack函数参数从来没有数组类型。它们实际上是通过指针传递的,而不是通过值传递的。这里的问题可能只是
main
中的变量。自动变量(如srcArr1等)在堆栈上分配,而堆栈上的分配通常非常有限。您需要改用heap当您分配内存时。@aschepler.您有理由:p…问题应该是主作用域中的大声明。:p…可能使数组
静态
或全局-更像是一个短期解决方案,但它避免了与
malloc
@coder相关的疑问和复杂问题,谢谢,这个解决方案解决了我的问题。据我所知,在for循环中,它应该是srcArr1而不是arr。