我只是在学习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。为了避免这种情况,您通常应该一次只写一小段代码,并经常编译和测试,这样您就知道在学习期间在哪里修复可能经常发生的错误(在这里的多个地方都很明显)。