【问题标题】:c++ segmentation error: Why this program gives Runtime Error(SIGSEGV)c++ 分段错误:为什么这个程序给出运行时错误(SIGSEGV)
【发布时间】:2018-04-12 14:11:51
【问题描述】:

此代码在代码块中运行良好,但在 codechef 的编译器中出现 Runtime(SIGSEGV) 错误 请通过下面的代码并告诉解决此错误的方法。谢谢。

#include<iostream>
using namespace std;
int main(){
int t;
long n;
cin>>t;
while(t--){
    cin>>n;
    int i=2,m=0,j=0,a[n/2];
    while(i<=n/2){
        if(n%i==0){
            n=n/i;
            a [ j++ ] = i;
            m++;
            i = 2;

        }
        else i++;
        a[j] = n;
    }
    cout << m+1 << endl;
    for(int i=0;i<=m;i++)
        cout << a[i] <<  endl;
}
return 0;
}

【问题讨论】:

  • 你做过调试吗?你查过 Segfault 是由什么引起的吗?
  • 哪里出了问题,你为解决这个问题做了哪些努力?
  • 我在这段代码中没有看到任何分段错误。但我认为值得一提的是,在某些编译器中,您需要提供常量值来声明数组,否则会出现编译器错误。
  • 当元素的数量不是常量表达式时,原始数组声明不是标准的 C++(例如,a[n/2],其中n 不是常量表达式)。这可能会导致问题,但无论哪种方式都不是标准的,应该避免(这也是 C++ 具有容器类的一个原因)。
  • @crashmstr 如果在标准 C++ 中无法在元素数量不是常量表达式时声明原始数组,那么请建议使用类的方法...

标签: c++ runtime-error segmentation-fault


【解决方案1】:

这是由无效的内存引用或分段错误引起的错误。最常见的原因是越界访问数组元素或使用过多内存。

您可以尝试一些事情:

确保您没有使用尚未初始化的变量。这些可能会在您的计算机上设置为 0,但不能保证在判断中。

检查访问数组元素的每一次出现,看看它是否可能超出范围。

确保您没有声明过多的内存。 64 MB 是有保证的,但数组大小为 [10000][10000] 将永远无法工作。

确保您没有声明过多的堆栈内存。任何大型数组都应在任何函数之外全局声明 - 将 100000 个整数的数组放入函数中可能行不通。

为了克服这个问题,请尝试使用静态内存分配。

分段错误的其他一些原因是:

  1. 使用未初始化的指针

  2. 空指针的解引用

  3. 访问不属于程序的内存。

您将在此处找到有关分段错误的更多详细信息。 click here

还要检查您的 while 循环代码。

【讨论】:

  • 非常感谢,但我之前也在网上找到了这种理论。请告诉我为什么这个程序中的代码会出现这种类型的错误。还有我该如何纠正它。
猜你喜欢
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多