C ubuntu上的分段错误,在debian上运行
至少对我来说足够令人惊奇。下面的代码导致分段错误:内核转储在我的ubuntu 15.04上,但在我的朋友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--;
数组
具有所需的索引,因此我获得了该索引的存储空间,并且索引具有整数值
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的来源。<代码>顶点< /代码>中有什么?常