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
,然后从结果数组中取出 c
和 c+1
元素,等等。
这个实际上的意思是:“从指针中取出c
和c+1
指针-指向指针基 array
,然后取消引用那些。
也就是说,应该是这样的:
(*array)[c] = (*array)[c + 1];
坦率地说,我认为没有理由首先通过地址传递该指针。
如评论中所述,您对运算符优先级还有其他问题:
*n--;
递减指针 n
,然后通过取消引用评估 n
的先前值,然后忽略该评估的结果并继续前进。 *n
中存储的值保持不变。它应该是:
(*n)--;
或简单地:
--*n;
我更喜欢后者,因为无论如何你都在抛弃 preval。无论如何,花更多时间研究链接运算符优先级图表。
至少对我来说已经足够了不起了。下面的代码在我的 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
,然后从结果数组中取出 c
和 c+1
元素,等等。
这个实际上的意思是:“从指针中取出c
和c+1
指针-指向指针基 array
,然后取消引用那些。
也就是说,应该是这样的:
(*array)[c] = (*array)[c + 1];
坦率地说,我认为没有理由首先通过地址传递该指针。
如评论中所述,您对运算符优先级还有其他问题:
*n--;
递减指针 n
,然后通过取消引用评估 n
的先前值,然后忽略该评估的结果并继续前进。 *n
中存储的值保持不变。它应该是:
(*n)--;
或简单地:
--*n;
我更喜欢后者,因为无论如何你都在抛弃 preval。无论如何,花更多时间研究链接运算符优先级图表。