主函数执行之前的C++segfault



我只是在学习c++。我试图编写一个函数,对数组执行一系列操作。最让我觉得奇怪的是,我的代码在主函数执行之前就出现了分段错误。这怎么可能?

#include <iostream>
using namespace std;
#define ARRAY_SIZE(array) (sizeof((array))/sizeof((array[0])))
void SelectionSort(int num[]){
  int i, j, first, temp;
  int numLength = ARRAY_SIZE(num);
  for (i = numLength - 1; i > 0; i--){
    first = 0;  // initialize to subscript of first element
    for (j=1; j<=i; j++){   // locate smallest between positions 1 and i.
      if (num[j] < num[first])
        first = j;
    }
    temp = num[first];   // Swap smallest found with element in position i.
    num[first] = num[i];
    num[i] = temp;
  }
  return;
}
int* reverse(int arr[]){
  int temp[ARRAY_SIZE(arr)];
  for(int i = 0; i < ARRAY_SIZE(arr); i++){
    for(int j = ARRAY_SIZE(arr); i > -1; i++){
      temp[i] = arr[j];
    }
  }
  delete arr;
  return temp;
}
int* sequence(int arr[], int size){
  if(int size = 0){
    int r[1];
    r[0] = 1;
    return r;
  }
  else{
    int* r;
    r = reverse(arr);
    int next[size];
    for(int i = 0; i < ARRAY_SIZE(arr); i++){
      next[i] = r[i] + arr[i];
    }
    SelectionSort(next);
    int ans[size + 1];
    ans[0] = 1;
    for(int i = 1; i < ARRAY_SIZE(arr); i++){
      ans[i] = next[i - 1];
    }
    return ans;
  }
}

int main(void){
  cout << "Start ";
  int arr[1];
  int* print;
  for(int i = 0; i <= 20; i++){
    cout << "in loop";
    if(i = 0){
      int arr[1];
      print = sequence(print, i);
    }
    else{
      print = sequence(print, i);;
    }
    cout << "[ ";
    for(int j = 0; j <= ARRAY_SIZE(print); j++){
      cout << print[j] << ", ";
    }
    cout << " ]n";
  }
}

当我运行此代码时,我会在segfault发生之前从main获得输出。

如果您依赖main的输出来确定segfault何时发生,那么如果从未刷新输出缓冲区,则可以在显示任何输出之前获取segfault。当使用cout时,输出不会立即显示在屏幕上,而是只有当输出缓冲区被刷新时才显示;例如,如果使用cout << "Start " << endl;而不是cout << "Start ";,则缓冲区将被刷新,并且您将看到输出,因为endl插入换行符并刷新缓冲区(您可能希望在那里使用换行符)。

关于查找segfault,我从代码的快速跟踪中初步猜测,可能是因为在序列函数中,对大小的检查应该是if(size == 0),而不是if(int size = 0)。您的大小被设置为0,而不是检查是否等于0。表达式被解释为0,这意味着false,所以当您不希望发生这种情况时,else语句正在执行。这可能表现为一个问题,稍后会导致segfault。为了避免这种情况,您通常应该一次只写一小段代码,并经常编译和测试,这样您就知道在学习期间在哪里修复可能经常发生的错误(在这里的多个地方都很明显)。

相关内容

  • 没有找到相关文章

最新更新