Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为矩阵分配内存时,为什么会出现分段错误?_C_Memory_Matrix_Segmentation Fault_Mpi - Fatal编程技术网

C 为矩阵分配内存时,为什么会出现分段错误?

C 为矩阵分配内存时,为什么会出现分段错误?,c,memory,matrix,segmentation-fault,mpi,C,Memory,Matrix,Segmentation Fault,Mpi,我正在研究一个带有矩阵的MPI程序。我需要在每个进程5矩阵。当我创建第五个矩阵时,我得到了一个分段错误 以下是一些屏幕截图: 在这里,当sPrevParts矩阵被注释掉时,它就起作用了 这是一个分段错误!:s 这里再次出现了分割错误。。。 这是代码的这一部分(如果你需要完整的代码,请告诉我) 矩阵创建函数 /* M(m*n) as array of rows, call free(p) */ void **matrix_create(size_t m, size_t n, s

我正在研究一个带有矩阵的MPI程序。我需要在每个进程5矩阵。当我创建第五个矩阵时,我得到了一个分段错误

以下是一些屏幕截图:

在这里,当sPrevParts矩阵被注释掉时,它就起作用了

这是一个分段错误!:s 这里再次出现了分割错误。。。

这是代码的这一部分(如果你需要完整的代码,请告诉我)

矩阵创建函数

    /* M(m*n) as array of rows, call free(p) */
    void **matrix_create(size_t m, size_t n, size_t size) {
       size_t i; 
       void **p= (void **) malloc(m*n*size+ m*sizeof(void *));
       char *c=  (char*) (p+m);
       for(i=0; i<m; ++i)
          p[i]= (void *) c+i*n*size;
       return p;
    }
/*M(M*n)作为行数组,无需调用(p)*/
void**matrix\u create(大小\u t m、大小\u t n、大小\u t size){
尺寸i;
void**p=(void**)malloc(m*n*size+m*sizeof(void*);
char*c=(char*)(p+m);

对于(i=0;i而言,
void*
给出了它:

malloc(m*n*size+ m*sizeof(void *));
实际上,您从未分配矩阵,而是只分配一个二维指针数组,然后将其视为一个
数组

  • 永远不要那样做
  • 您可能正在使用32位运行时进行开发,其中指针的大小只有
    double
    的一半(或者其他类型的系统,其中指针比
    double
    小)

  • 考虑使用时如何使用矩阵的基本参考。

    您总是希望从查看/共享所有SEGFULT的堆栈跟踪开始。还请注意,缺少证据并不是缺少证据;这意味着当没有提出SEGFULT时,您仍然可以(很可能)内存访问无效。请确保让您的开发工具(无论是Valgrind、Visual Studio还是其他)报告所有访问冲突。您需要应用“二进制搜索”对于问题。打印语句直到你发现问题的原因。然后开始删除部分,直到你有一个仍然崩溃的小程序。发布该程序。感谢你的回答。问题是在Scatterv中。我不知道如何解决这个问题。当我删除一些代码时,矩阵并没有分散。它工作了ks,但我需要注释掉的东西。这些Scatterv是怎么回事?再次感谢。:/Hi@Domi。谢谢你的回答,但我仍然不知道我的MPI_Scatterv操作是怎么回事。:顺便说一下,我不知道如何更改“void*”你提到的东西。你能解释得更好吗?再次感谢。说实话,现在我再看一遍,这不是问题所在。我可能不得不收回我的答案。从你的问题来看,听起来这不是你的代码,你不太清楚你在做什么。也许你想从零开始,用一个更简单的版本你想做的事情。单<代码> Malc 数组实际上分配了矩阵,另外,一组指针指向每一行。考虑这个问题,并确保在正确的位置得到正确的数据。
    malloc(m*n*size+ m*sizeof(void *));