在C中将字符串文字作为参数传递时的分段错误

时间:2018-09-16 04:24:38

标签: c

我试图编写一个使用C语言中的OpenMP执行矩阵乘法的程序。每当我尝试将字符串文字作为参数传递给函数时,我都会遇到分段错误。

#include<stdio.h>
#include<time.h>
#include<omp.h>

struct matrix{
    int r;
    int c;
    int mat[1000][1000];
};

void read_matrix(char* fname, struct matrix* m){
    FILE *fp;
    fp = fopen(fname,"r");

    fscanf(fp, "%d %d",&m->r,&m->c);
    for(int i=0;i<m->r;i++){
        for(int j=0;j<m->c;j++){
            fscanf(fp, "%d", &m->mat[i][j]);
        }
    }
    fclose(fp);
}

void write_matrix(char* fname, struct matrix m){
    FILE *fp;
    fp = fopen(fname,"w");
    fprintf(fp,"%d %d\n",m.r,m.c);
    for(int i=0;i<m.r;i++){
        for(int j=0;j<m.c;j++){
            fprintf(fp,"%d\n",m.mat[i][j]);
        }
    }
    fclose(fp);
}

void main(){
    struct matrix m1;
    struct matrix m2;
    struct matrix res;
    read_matrix("m1",&m1);
    read_matrix("m2",&m2);
    int r1 = m1.r;
    int c1 = m1.c;
    int c2 = m2.c;
    res.r = r1;
    res.c = c2;
    for(int i=0;i<r1;i++){
        for(int j=0;j<c2;j++){
            res.mat[i][j] = 0;
        }
    }
    #pragma omp parallel
    {
        #pragma omp for
        for(int i = 0; i < r1; i++){
            for(int j = 0; j < c2; j++){
                for(int k = 0; k < c1; k++){
                    #pragma omp atomic update
                    res.mat[i][j] += m1.mat[i][k]*m2.mat[k][j];
                }
            }
        }
    }
    write_matrix("res",res);

}

代码在运行时显示Segmentation fault (core dumped)。 在GDB上运行时,它表明 Program received signal SIGSEGV, Segmentation fault. 0x0000000000400ad9 in main () at mm.c:40 40 read_matrix("m1",&m1); 在第一次read_matrix()调用之前,我添加了一个printf语句printf("check\n"); 现在,printf调用开始引发分段错误。 我假设传递字符串文字是导致错误的原因。代码可能有什么问题?

1 个答案:

答案 0 :(得分:5)

  

在第一次%c调用之前,我添加了printf语句   read_matrix()现在,printf调用开始引发分段   错误。

我认为可能会发生,因为您在堆栈上分配了printf("check\n");。每个矩阵约为4MB,因此堆栈为12MB。我猜它创建了站点(堆栈溢出)。

尝试将静态变量用于矩阵或动态分配它们。它可以解决您的问题。如果没有,则永远不要在堆栈上分配12MB的结构...