【问题标题】:C++ segmentation fault badly detected by debugger调试器严重检测到 C++ 分段错误
【发布时间】:2012-10-28 11:25:19
【问题描述】:

下面是我的 c++ 程序的开始。它对我来说看起来很正常,但是当我运行它时,我得到了分段错误。这是调试器给我的:

Program received signal SIGSEGV, Segmentation fault.
0x00000000004008d4 in main () at usu.cpp:12
12      cin >> n >> k;

但错误与这行代码无关,因为当我在 for 循环程序正常结束之前输入“reutrn 1”时。有什么问题?我编译我的程序使用:g++ -ggdb3

#include <iostream>
#include <stdio.h>
#define MAX_N 1000000
#define MAX_K 1000000
#define MAX_IL_KROKOW 500000

using namespace std;

int main()
{
    int n, k;   
    cin >> n >> k;

    char klocki[MAX_N+1];
    int Przes_C[MAX_IL_KROKOW];//podaje następne c po c znajdującym się na pozycji i
    int Ktore_b[MAX_N];//na podstawie indeksu b w klockach zwraca indeks w tablicy Przes_b
    int Przes_b[MAX_N];//zwraca indeks b w klockach na podstawie występowania b 
    int poprz_c = -1;
    int ilosc_b = 0;
    int klocki_len = 0;
    for(int i=0;i<n;i++) 
    {   
        klocki[i] = getchar();
        return 1;
        if(klocki[i] == 'b')
        {   
            Przes_b[ilosc_b] = i;
            Ktore_b[i] = ilosc_b;
            ilosc_b++;
        }       
        if(poprz_c != -1 && klocki[i] == 'c')
            Przes_C[poprz_c] = i;
        if(klocki[i] == 'c')
            poprz_c = i; 

        klocki_len++;
    }       
    klocki[klocki_len] = '\0';

【问题讨论】:

  • BTW 如果你使用 C++,你应该包含 而不是

标签: c++ gdb g++ segmentation-fault


【解决方案1】:

当您尝试向数组写入内容时,您的数组分配可能会失败,从而导致未定义的行为。

char klocki[MAX_N+1];
int Przes_C[MAX_IL_KROKOW];
int Ktore_b[MAX_N];
int Przes_b[MAX_N];

这些是巨大的数组。每个进程只分配固定大小的堆栈。使用new 创建动态数组。

【讨论】:

  • std::vector 会更好。
  • 为什么 std::vector 会比动态数组更好?是更快还是更简单。
  • @SzymonOlewniczak 因为 std::vector 比 new 有优势:容器更安全,为您处理内存管理,当您推送到矢量时大小自动增长等。
  • @KingsIndian “每个进程只分配固定大小的堆栈”在我知道的大多数操作系统上不正确。该问题很可能与堆栈溢出有关,但由于“固定堆栈大小”,可能不会发生溢出。
  • @EmployedRussian 不确定我是否理解你。在我的 Linux 上,默认情况下它是 8MB(当然可以更改)。由于 OP 正在分配巨大的数组,因此无论为他的平台上的进程分配的堆栈大小如何,这可能是他溢出的原因。
【解决方案2】:

您还可以将数组变量定义为主函数之外的全局变量。这是否有意义取决于您的程序(长度)。

【讨论】:

  • 如果您在main() 之外不需要它们,最好将它们定义为static
猜你喜欢
  • 2016-01-30
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 2015-12-23
相关资源
最近更新 更多