矩阵乘法错误:分段错误(核心转储)

时间:2013-04-12 10:26:08

标签: c

我有以下代码,我想计算几个不同大小的矩阵乘法的运行时间。我从矩阵大小100开始,一直移动到500,但是当我尝试1000时,我得到一个错误说:分段错误(核心转储),所以我认为它必须对内存做些什么。我想计算大小为5000甚至10000的矩阵的运行时间。任何人都可以帮我解决问题吗?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 1000

int main(void)
{
    int A[SIZE][SIZE], B[SIZE][SIZE], C[SIZE][SIZE] = {0};
    int i, j, k;

    srand(time(NULL));

    for(i = 0; i < SIZE; i++)
    {
        for(j = 0; j < SIZE; j++)
        {
            A[i][j] = rand()%100;
            B[i][j] = rand()%100;
        }
    }

    clock_t begin, end;
    double time_spent;

    begin = clock();

    for(i = 0; i < SIZE; i++)
        for(j = 0; j < SIZE; j++)
            for(k = 0; k < SIZE; k++)
                C[i][j] += A[i][k] * B[k][j];

    end = clock();

    time_spent = (double)(end - begin) / CLOCKS_PER_SEC;

    printf("Elapsed time: %.2lf seconds.\n", time_spent);

    return 0;
}

1 个答案:

答案 0 :(得分:2)

这是一个经典的stack overflow - 您的堆栈中有3个大小约为4 MB的本地阵列(假设32位整数),总共大约12 MB。在大多数现代操作系统上,堆栈通常为8 MB或更少。要么使变量成为静态的,例如

static int A[SIZE][SIZE], B[SIZE][SIZE], C[SIZE][SIZE] = {0};

以便它们不再驻留在堆栈上,或动态分配它们。