Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.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 双for回路熔断时的SEG故障_C_For Loop_Pointers_Parallel Processing_Openmp - Fatal编程技术网

C 双for回路熔断时的SEG故障

C 双for回路熔断时的SEG故障,c,for-loop,pointers,parallel-processing,openmp,C,For Loop,Pointers,Parallel Processing,Openmp,我读过关于如何熔断回路的书。目标是融合我的双for循环,以便与OpenMP并行。我之所以不使用collapse(2),是因为内部循环依赖于外部循环。我也读过这篇相关的文章 然而,我的问题是,当我融合我的循环时,我得到了一个分段错误错误,这听起来很模糊。我很确定我做了正确的转换。不幸的是,我无法提供一个可复制的最小示例,因为我的程序有大量的函数,它们在其中相互调用。以下是我的初始循环: for(int i=0; i<size; i++) { int counter = 0;

我读过关于如何熔断回路的书。目标是融合我的双
for
循环,以便与OpenMP并行。我之所以不使用
collapse(2)
,是因为内部循环依赖于外部循环。我也读过这篇相关的文章

然而,我的问题是,当我融合我的循环时,我得到了一个
分段错误
错误,这听起来很模糊。我很确定我做了正确的转换。不幸的是,我无法提供一个可复制的最小示例,因为我的程序有大量的函数,它们在其中相互调用。以下是我的初始循环:

for(int i=0; i<size; i++)
{  
    int counter = 0;
    for(int j=0; j<size; j++)
    {
        if (i==j)
            continue;
        if(arr[size * i + j])
        {
          
            graph->nodes[i]->degree++;
            graph->nodes[i]->neighbours[counter] = (Node*)malloc(sizeof(Node));
            graph->nodes[i]->neighbours[counter] = graph->nodes[j];
            counter++;
        }
    }
}
我尝试过使用
valgrind
进行调试,最奇怪的是
分段错误
似乎不在这些特定行上,尽管只有在我进行循环转换时才会发生

迷你免责声明:正如您可能猜到的,由于这些指针变量,我使用了大量的
malloc
s

我不希望您在我发布的代码中遇到相同的错误,这就是为什么我的问题更一般:理论上,环路融合如何会导致segfault错误?

我认为在转换后的环路中,您将
I
j
混在一起

它应该是
inti=n%大小,而不是
j


n/size
始终等于0。

您正在为具有
graph->nodes[i]->邻居[counter]=(node*)malloc(sizeof(node))的节点分配内存,但下一行会把内存扔掉。@SteveFriedl,这是个陷阱。谢谢我不确定。对不起,事实并非如此。那只是个打字错误。我修好了。这是
size*size
,因此
n/size
并不总是给出
0
。不过感谢您的注意。
for(int n=0; n<size*size; n++)
{  
    int i = n / size;
    int j = n % size;
    int counter = 0;
    for(int j=0; j<size; j++)
    {
        if (i==j)
            continue;
        if(arr[size * i + j])
        {
          
            graph->nodes[i]->degree++;
            graph->nodes[i]->neighbours[counter] = (Node*)malloc(sizeof(Node));
            graph->nodes[i]->neighbours[counter] = graph->nodes[j];
            counter++;
        }
    }
}