debian 上 ubuntu、运行 上的分段错误

Segmentation fault on ubuntu, Run on debian

至少对我来说已经足够了不起了。下面的代码在我的 ubuntu 15.04 上导致 segmentation fault: core dump,但在我的朋友 debian 平台上成功 运行。

另请注意,我知道我的 array 具有所需的索引,因此我为其获取存储空间并且索引具有整数值。

int array_dequeue(int **array, int *n)
{
    int c;
    for (c = 0; c < *n - 2 ; c++)
        *array[c] = *array[c + 1];
    *n--;

    return 0;
}

//Calling that in main
int main(int argc, char* argv[])
{
    int length = atoi(argv[1]); // ./mpi.o 4 so length is 4
    int *VP;
    VP = (int*)malloc(length*sizeof(int));

    for(i=0; i<vertices; i++)
    {
        VP[i] = i + 1;
    }
    array_dequeue(&VP, &length);
}

如有任何帮助,我们将不胜感激。提前致谢

您在执行此语句时缺少 operator precedence 的顺序:

*array[c] = *array[c + 1];

认为 这意味着“解引用 array,然后从结果数组中取出 cc+1 元素,等等。

这个实际上的意思是:“从指针中取出cc+1指针-指向指针基 array,然后取消引用那些。

也就是说,应该是这样的:

(*array)[c] = (*array)[c + 1];

坦率地说,我认为没有理由首先通过地址传递该指针。

如评论中所述,您对运算符优先级还有其他问题:

*n--;

递减指针 n,然后通过取消引用评估 n 的先前值,然后忽略该评估的结果并继续前进。 *n 中存储的值保持不变。它应该是:

(*n)--;

或简单地:

--*n;

我更喜欢后者,因为无论如何你都在抛弃 preval。无论如何,花更多时间研究链接运算符优先级图表。