C ubuntu上的分段错误,在debian上运行

C ubuntu上的分段错误,在debian上运行,c,ubuntu,segmentation-fault,coredump,C,Ubuntu,Segmentation Fault,Coredump,至少对我来说足够令人惊奇。下面的代码导致分段错误:内核转储在我的ubuntu 15.04上,但在我的朋友debian平台上成功运行 还要注意的是,我知道我的数组具有所需的索引,因此我获得了该索引的存储空间,并且索引具有整数值 int array_dequeue(int **array, int *n) { int c; for (c = 0; c < *n - 2 ; c++) *array[c] = *array[c + 1]; *n--;

至少对我来说足够令人惊奇。下面的代码导致分段错误:内核转储在我的ubuntu 15.04上,但在我的朋友debian平台上成功运行

还要注意的是,我知道我的
数组
具有所需的索引,因此我获得了该索引的存储空间,并且索引具有整数值

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);
}
int数组\u出列(int**array,int*n)
{
INTC;
对于(c=0;c<*n-2;c++)
*数组[c]=*数组[c+1];
*n--;
返回0;
}
//总而言之
int main(int argc,char*argv[])
{
int length=atoi(argv[1]);///mpi.o 4,因此长度为4
int*VP;
VP=(int*)malloc(长度*尺寸(int));

对于(i=0;i执行此语句时,缺少顺序:

*array[c] = *array[c + 1];
您认为这意味着“取消引用
数组
,然后从结果数组中获取
c
c+1
元素,等等

这实际上意味着:“将
c
c+1
指针从指向指针基
数组的指针中取出,然后取消引用这些指针

换句话说,应该是这样的:

(*array)[c] = (*array)[c + 1];
坦白地说,我认为没有理由一开始就按地址传递指针

如评论中所述,您在运算符优先级方面还存在以下问题:

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

(*n)--;
或者简单地说:

--*n;

我更喜欢后者,因为不管怎样,您都要扔掉preval。无论如何,请花更多的时间研究链接运算符优先级图表。

您缺少执行此语句的顺序:

*array[c] = *array[c + 1];
您认为这意味着“取消引用
数组
,然后从结果数组中获取
c
c+1
元素,等等

这实际上意味着:“将
c
c+1
指针从指向指针基
数组的指针中取出,然后取消引用这些指针

换句话说,应该是这样的:

(*array)[c] = (*array)[c + 1];
坦白地说,我认为没有理由一开始就按地址传递指针

如评论中所述,您在运算符优先级方面还存在以下问题:

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

(*n)--;
或者简单地说:

--*n;

我更喜欢后者,因为不管怎样,您都要扔掉preval。无论如何,请花更多的时间研究链接运算符优先级图表。

您缺少执行此语句的顺序:

*array[c] = *array[c + 1];
您认为这意味着“取消引用
数组
,然后从结果数组中获取
c
c+1
元素,等等

这实际上意味着:“将
c
c+1
指针从指向指针基
数组的指针中取出,然后取消引用这些指针

换句话说,应该是这样的:

(*array)[c] = (*array)[c + 1];
坦白地说,我认为没有理由一开始就按地址传递指针

如评论中所述,您在运算符优先级方面还存在以下问题:

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

(*n)--;
或者简单地说:

--*n;

我更喜欢后者,因为不管怎样,您都要扔掉preval。无论如何,请花更多的时间研究链接运算符优先级图表。

您缺少执行此语句的顺序:

*array[c] = *array[c + 1];
您认为这意味着“取消引用
数组
,然后从结果数组中获取
c
c+1
元素,等等

这实际上意味着:“将
c
c+1
指针从指向指针基
数组的指针中取出,然后取消引用这些指针

换句话说,应该是这样的:

(*array)[c] = (*array)[c + 1];
坦白地说,我认为没有理由一开始就按地址传递指针

如评论中所述,您在运算符优先级方面还存在以下问题:

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

(*n)--;
或者简单地说:

--*n;

我更喜欢后者,因为你无论如何都要扔掉preval。无论如何,花更多的时间研究链接运算符优先图。

请包括定义和初始化部分。这可能是SEGFULT的来源。
顶点中有什么?
*n--
更改为
(*n)--
;postfix
--
*
绑定得更紧密,因此您正在递减指针,而不是指针指向的对象。或者只使用
--*n
,因为您无论如何都要丢弃上一个数组。您可能需要查看。这可能会改变您对
*数组[c]的理解真的是。再次。看看C,然后考虑<代码> *[C] 实际上。请包含定义和初始化部分。这可能是Sebug的源代码。<代码>顶点< /代码>中的什么?更改<代码> *N-<代码> > <代码>(*n)--
;postfix
--
*
绑定得更紧密,因此您正在递减指针,而不是指针指向的对象。或者只使用
--*n
,因为您无论如何都要丢弃上一个数组。您可能需要查看。这可能会改变您对
*数组[c]的理解真的是。再次。看看C,然后考虑<代码> *[C] 实际上是什么。请包括定义和初始化部分。这可能是Sebug的来源。<代码>顶点< /代码>中有什么?常