获得C ++分段错误

时间:2016-06-06 03:51:57

标签: c++ segmentation-fault

我在Linux服务器上,当我尝试执行该程序时,它返回了一个分段错误。当我使用gdb尝试找出原因时,它返回..

Starting program: /home/cups/k

Program received signal SIGSEGV, Segmentation fault.
0x0000000000401128 in search(int) ()
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.192.el6.x86_64 libgcc-4.4.7-17.el6.x86_64 libstdc++-4.4.7-17.el6.x86_64

我无法解释这一点。在我的程序中,我有一个名为" search()"但我没有看到任何会导致段错误的事情。这里的功能是def:

int search (int bit_type) {                                               // SEARCH FOR A CONSEC NUMBER (of type BIT_TYPE) TO SEE IF ALREADY ENCOUNTERED

    for (int i = 1; i <= MAX[bit_type]; i++) {               //GO THRU ALL ENCOUNTERED CONSEC NUMBERS SO FAR (for type BIT_TYPE)
        if (consec == r[bit_type][i])                           // IF: FOUND
        return i;                                                                       //                      -----> RETURN INDEX OF RECORDED CONSEC_NUM
    }
    // IF: NOT FOUND
    r[bit_type][++MAX[bit_type]] = consec;                          //                      -----> INCREMENT MAX[bit_type]  &  RECORD NEW CONSEC_NUM -------> ARRAY[MAX]
    n[bit_type][MAX[bit_type]] = 1;
    return (MAX[bit_prev]);                                                          //                      -----> RETURN THE NEWLY FILLED INDEX 
}

全球职能:

int MAX[2];
int r[2][200];
int n[2][200];

这些评论对你们来说毫无用处,因为你们没有其他程序......但是你可以忽略它们。

但你们看到我错过了什么吗?

1 个答案:

答案 0 :(得分:4)

从链接到您的代码here,这里只有一个错误:

 int *tmp = new int[MAX[0]];
 for (int y = 0; y <= MAX[0]; y++) {
     tmp[y] = 1;
}

你在最后一次迭代中走出界限。您分配了一个包含MAX[0]项的数组,并在最后一次迭代中访问tmp[MAX[0]]

那个循环应该是:

 int *tmp = new int[MAX[0]];
 for (int y = 0; y < MAX[0]; y++) {
     tmp[y] = 1;
}

或更好:

 #include <algorithm>
    //...
    std::fill(tmp, tmp + MAX[0], 1);  // no loop needed

或使用new[]跳过动态分配并使用std::vector

  #include <vector>
  //...
  std::vector<int> tmp(MAX[0], 1);

通常,您有多个执行此操作的循环:

for (int i = 1; i <= number_of_items_in_array; ++i )

然后使用array[i]访问数组。它是<=循环条件中的for是可疑的,因为它将尝试在最后一次迭代中使用越界索引访问数组。

另一个例子是:

long sum(int arr_r[], int arr_n[], int limit)
{
    long tot = 0;
    for (int i = 1; i <= limit; i++)
    {
        tot += (arr_r[i])*(arr_n[i]);
    }
    return tot;
}

这里,limit是数组中元素的数量,并且在最后一次迭代中访问arr_r[i],导致未定义的行为。

从0到最高n - 1开始索引数组,其中n是元素的总数。试图伪造基于1的数组,因为您尝试做的几乎总是在代码库内部的某处导致这些类型的错误。