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,然后从结果数组中获取 cc+1 元素,等等。

这个实际上的意思是:“从指针对指针基array中取出cc+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:“分段错误(核心转储)”

C++ 服务器 Linux 机器上的分段错误 - 适用于 Mac

一个简单的 qt 程序未运行并显示“分段错误”的错误消息

在VNC上运行Qt GUI应用程序导致分段错误,并显示错误消息