我理解如何创建它。例如:
instance
将输出:
int ar1[3] = {1, 2, 3};
int ar2[4] = {4, 5, 6, 7};
int* ar[2] = {ar1, ar2};
cout << *(ar[1]+2);
现在,我想使用6
创建相同的数组。输入的格式如下。第一行存储数组cin
的数量。其他n
行首先存储数组中元素的数量,然后存储数组的元素。例如:
n
要解析输入并创建数组,我有以下代码:
2
3 1 2 3
4 4 5 6 7
哪个输出:
int n;
cin >> n;
cout << "The number of variable-length arrays: " << n << endl;
int* ar [n];
for (int k = 0; k < n; k++){
cout << "..reading the array number: " << k + 1 << endl;
int n_el; cin >> n_el;
cout << "The array contains " << n_el << " elements." << endl;
int ar_k [n_el];
for (int j = 0; j < n_el; j++) {
cin >> ar_k[j] ;
}
ar[k] = ar_k;
for (int j = 0; j < n_el; j++) {
cout << *(ar[k] + j) << endl;
}
}
但是,如果我尝试访问循环外的数组,它就不起作用。鉴于代码:
The number of variable-length arrays: 2
..reading the array number: 1
The array contains 3 elements.
1
2
3
..reading the array number: 2
The array contains 4 elements.
4
5
6
7
输出是:
for (int j = 0; j < 3; j++) {
cout << *(ar[0] + j) << endl;
}
我想这是因为只要你不在循环中,存储数组的内存就会被释放。怎么预防这个?或者我应该使用不同的方法来解决任务?
答案 0 :(得分:1)
你是对的,当你退出循环时,内存会被释放。
此外,您的代码是非法的int* ar [n];
,其中n是变量,不是合法C ++。即使您的编译器接受它(另一个编译器也不接受)。
另一种方法是使用new
使用动态内存分配。取代
int* ar [n];
与
int** ar = new int*[n];
和
int ar_k [n_el];
与
int* ar_k = new int[n_el];
动态分配的重点是,在你delete
之前,内存不会被释放。
动态内存分配是一个很大的主题,这个答案只是浮出水面。一些阅读的时间。