ubuntu上的分段错误,在debian上运行
Posted
技术标签:
【中文标题】ubuntu上的分段错误,在debian上运行【英文标题】:Segmentation fault on ubuntu, Run on debian 【发布时间】:2015-08-31 19:08:01 【问题描述】:至少对我来说足够了不起。下面的代码在我的 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);
任何帮助将不胜感激。提前致谢
【问题讨论】:
请包括定义和初始化部分。这可能是段错误的来源。vertices
中有什么内容?
把*n--
改成(*n)--
;后缀--
比*
绑定得更紧密,所以你减少的是指针,而不是它指向的内容。
或者只使用--*n
,因为无论如何你都在扔掉preval。你可能想看看operator precedence chart。它可能会改变您对 *array[c]
真正含义的理解。
再次。查看 C 的 the operator precedence,然后考虑 *array[c]
的实际作用。
【参考方案1】:
您在执行此语句时缺少operator precedence 的顺序:
*array[c] = *array[c + 1];
您认为这意味着“取消引用 array
,然后从结果数组中获取 c
和 c+1
元素,等等。
这个实际上的意思是:“从指针对指针基array
中取出c
和c+1
指针,然后取消引用它们。
换句话说,应该是这样的:
(*array)[c] = (*array)[c + 1];
坦率地说,我认为首先没有理由按地址传递该指针。
正如 cmets 中所述,您在运算符优先级方面还有其他问题:
*n--;
递减指针n
,然后通过取消引用评估n
的先前值,然后忽略该评估的结果并继续前进。存储在*n
的值保持不变。它应该是:
(*n)--;
或者简单地说:
--*n;
我更喜欢后者,因为无论如何你都要扔掉 preval。无论如何,花更多时间研究链接的运算符优先级图表。
【讨论】:
非常感谢,但您知道为什么它在 debian 上有效吗?! @HosseinShahsahebi 我看不出为什么它应该在任何平台上完全工作。您正在使用我指出的array
deref-subscripting 调用未定义的行为,因此一旦发生 任何事情 都可能导致,包括盲目松鼠发现坚果场景和实际出现的情况 工作.
无论如何我感谢您的耐心和精彩的描述
@HosseinShahsahebi 没问题。保留指向我链接的那个网站的链接。它是 C 和 C++(最好的恕我直言之一)的杰出参考。以上是关于ubuntu上的分段错误,在debian上运行的主要内容,如果未能解决你的问题,请参考以下文章
linux (g++) 上的分段错误,但 Mac OS 上没有。?
另一个系统上的应用程序在启动时崩溃,没有 sudo 的错误消息,非 sudo 的分段错误
无法从 cpp 代码运行 image_transport:“分段错误(核心转储)”