我有一个简单的C程序来运行一些矩阵矩阵乘法进行某些测试:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 1000
#define R_M 100
void disp_matrix(double A[N][N]);
int main()
{
clock_t begin, end;
double time_spent;
begin = clock();
int seed = 1;
srand(seed);
double A[N][N];
double B[N][N];
double C[N][N];
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
A[i][j] = (double)rand()/(double)(RAND_MAX/R_M);
B[i][j] = (double)rand()/(double)(RAND_MAX/R_M);
C[i][j] = 0.;
}
}
for(int i = 0; i < N; i++){
for(int k = 0; k < N; k++){
for(int j = 0; j < N; j++){
C[i][k] += A[i][j] * B[j][k];
}
}
}
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("Time spent: %f\n", time_spent );
/* disp_matrix(C); */
return 0;
}
void disp_matrix(double A[N][N]){
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
printf("%10.3g",A[i][j]);
}
printf("\n");
}
return;
}
如果我编译:
gcc -Wall -std=c11 -O2 test.c -o test && ./test
程序运行正常但是,如果我运行:
gcc -Wall -std=c11 test.c -o test && ./test
/bin/bash: Zeile 1: 10617 Speicherzugriffsfehler ./test
C编译正常,但程序的执行给了我一个分段错误(Speicherzugriffsfehler)。我真的无法弄清楚为什么会这样做。
为什么优化“修复”我的程序以及原始错误在哪里。对于如此小的数组,我应该有足够的内存。
答案 0 :(得分:1)
问题的根源是堆栈上的巨大数组,导致堆栈溢出,导致seg错误事件,
建议将数组从当前的main()函数范围移到文件范围。
答案 1 :(得分:1)
正如一些评论中所建议的那样,数组对于静态定义来说很重要。我使用了malloc(),它运行良好。
编辑: 另外,(评论时)优化'修复'我的程序,因为我不使用C,因此不会计算。