我有一个非常简单的程序,如下所示。我已插入cout
来知道哪一行被执行。
int main(void) {
int n_in = 0;
int keys = 0;
cin>>n_in;
long long in_array[n_in];
for(int i=0; i<n_in; i++){
cin>>in_array[i];
}
cout<<"Executed";
cin>>keys;
cout<<"Executed"<<" "<<keys;
int index[keys];
long long key_array[keys];
cout<<"Executed";
for(int j=0; j<keys; j++){
cin>>key_array[j];
cout<<"Iteration" <<j<<"complete" ;
}
cout<<"Executed";
//bin_search(in_array, n_in, key_array, keys, index);
for(int i=0; i<keys; i++){
cout<<index[i]<<" " ;
}
return 0;
}
截图给出了:
从图像中可以看出,最后一次迭代永远不会完成,我不知道为什么。 iteration0complete
等之后的数字是输入。
有人可以解释一下发生了什么吗?
答案 0 :(得分:1)
以下是您的代码的修改版本,正如我在vectors
arrays
index[]
中使用的注释中所述,因为您可以在不知道其大小的情况下使用向量,这与声明的相反数组,在编译时编译器必须知道数组的大小,但是你定义了一个数组,你给它一个在编译时不是常量的大小,我评论了你使用数组的代码部分{{1因为我不知道为什么你要打印数组有什么,虽然它是空的,你只是声明它里面没有任何内容。
这里的代码希望它满足您的需求。
#include<string>
#include<vector>
#include<iostream>
using namespace std;
int main(){
int n_in = 0;
int keys = 0;
cin>>n_in;
vector<long long> in_array;
for(int i=0; i<n_in; i++){
int k =0;
cin >> k;
in_array.push_back(k);
}
cout<<"Executed";
cin>>keys;
cout<<"Executed"<<" "<<keys;
vector<int> index;
vector<long long> key_array;
cout<<"Executed";
for(int j=0; j<keys; j++){
int p =0;
cin>>p ;
key_array.push_back(p);
cout<<"Iteration" <<j<<"complete" ;
}
cout<<"Executed";
//bin_search(in_array, n_in, key_array, keys, index);
/*for(int i=0; i<keys; i++){
int m =0;
cout<<index[i]<<" " ;
}
*/
return 0;
}
修改强> 您在注释中所说的内容在C中是正确的,但在c ++中编译器需要在编译时具有该数组的确切大小,否则您将不得不使用new运算符来动态分配内存。
例如:
int MyArray[5]; // correct
或
const int ARRAY_SIZE = 6;
int MyArray[ARRAY_SIZE]; // correct
但
int ArraySize = 5;
int MyArray[ArraySize]; // incorrect
总结一下:
数组的元素数必须是常量表达式。如果需要变量边界,请使用向量。