主函数执行前的C ++段错误

时间:2016-05-02 18:28:07

标签: c++ segmentation-fault

我只是在学习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";
  }
}

1 个答案:

答案 0 :(得分:1)

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

如果您依靠main的输出来确定何时发生段错误,那么如果输出缓冲区从未被刷新,则可以在显示任何输出之前获取段错误。使用cout时屏幕上不会立即显示输出,而是仅在输出缓冲区被刷新时显示;如果您使用例如cout << "Start " << endl;而不是cout << "Start ";,缓冲区将刷新并且您将看到输出,因为endl插入换行符并且还刷新缓冲区(您可能想要在那里划线。

关于找到你的段错误,我对你的代码的快速描述的初步猜测表明,可能是因为在你的序列函数中,你的大小检查应该是if(size == 0),而不是{{1} }。您的大小被设置为0,而不是被检查为等于0.表达式被解释为0,这意味着为false,因此当您不希望发生时,正在执行else语句。这可能表现为导致稍后发生段错误的问题。 为了避免这种情况,你通常应该一次编写一小段代码并经常编译和测试,以便你知道在哪里修复你的错误,这些错误可能经常发生(并且在这里很多地方很明显),而你还在学习