我只是在学习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";
}
}
答案 0 :(得分:1)
当我运行此代码时,我会在发生段错误之前从main获得输出。
如果您依靠main的输出来确定何时发生段错误,那么如果输出缓冲区从未被刷新,则可以在显示任何输出之前获取段错误。使用cout时屏幕上不会立即显示输出,而是仅在输出缓冲区被刷新时显示;如果您使用例如cout << "Start " << endl;
而不是cout << "Start ";
,缓冲区将刷新并且您将看到输出,因为endl
插入换行符并且还刷新缓冲区(您可能想要在那里划线。
关于找到你的段错误,我对你的代码的快速描述的初步猜测表明,可能是因为在你的序列函数中,你的大小检查应该是if(size == 0)
,而不是{{1} }。您的大小被设置为0,而不是被检查为等于0.表达式被解释为0,这意味着为false,因此当您不希望发生时,正在执行else语句。这可能表现为导致稍后发生段错误的问题。
为了避免这种情况,你通常应该一次编写一小段代码并经常编译和测试,以便你知道在哪里修复你的错误,这些错误可能经常发生(并且在这里很多地方很明显),而你还在学习