我正在阅读的C ++书籍告诉我们,数组将使用常量变量设置,但我想让用户输入指示数组的大小,并且它有效。是否有我应该担心的问题。
答案 0 :(得分:5)
你是如何声明阵列的?
如果以这种方式声明,可以创建一个大小基于变量的数组:
int size;
cin >> size;
// (assert size is > 0 and < some really big number here)
int* myarray = new int[size];
// Do stuff with it here...
delete [] myarray; // Don't forget this.
这将工作得很好。你不应该能够以这种方式创建一个数组:
int size;
cin >> size;
int myarray[size]; // should break with an ugly compiler error.
如果您使用了第二种方法并且它有效,那么您就有了一个奇怪的编译器,当您在其他平台上使用其他编译器时,您不应指望它正常工作。
答案 1 :(得分:3)
使用C数组不是最佳做法。请改用std::vector。
int n;
std::cin>>n;
std::vector<int> vec(n);//declares int array size of n;
要使用std::vector
,您应该包含<vector>
。
此外,矢量更灵活。例如,您可以在运行时更改向量的大小。
std::vector<int> vec;//declares empty vector
int some_numb;
while(std::cin>>some_numb)//read untill end of file
vec.push_back(some_numb);//add element at the end of array;
Edit:
如果您仍想使用C样式数组而不是向量,这里是语法。
int n;
std::cin>>n;
int * arr = new int[n];
但请记住,在以这种方式创建数组之后,您还应该手动删除它。这是语法。
delete []arr;
答案 2 :(得分:2)
有两种不同的数组分配技术,第一种是 static ,在编译程序时你知道数组的大小。由于在编译时必须知道大小,因此最好使大小为整数const
以防止意外更改,这可能会导致程序崩溃:
const int myarray_size = 10;
int myarray[myarray_size];
第二个是动态,只有在运行时才能在编译时知道数组的大小。你必须在这里调用new
运算符来告诉操作系统为数组分配内存:
int myarray_size;
cin >> myarray_size;
int* myarray = new int[myarray_size];
您在使用完阵列后也必须稍后调用delete[] myarray
。
以下是为什么将const
用于静态数组大小是一个好习惯的示例:
const int myarray_size = 10;
cin >> myarray_size; // This won't compile because you're trying to change a const
int myarray[myarray_size];
以下可能会编译(取决于您的设置),但在运行时很容易导致程序崩溃:
int myarray_size;
cin >> myarray_size;
int myarray[myarray_size]
答案 3 :(得分:1)
如果你不添加任何检查,用户可能会创建一个庞大的数组,这可能会占用大量内存。