使用stdin的输入创建指针数组

时间:2018-02-14 06:57:46

标签: c++ arrays pointers

我理解如何创建它。例如:

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;
}

我想这是因为只要你不在循环中,存储数组的内存就会被释放。怎么预防这个?或者我应该使用不同的方法来解决任务?

1 个答案:

答案 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之前,内存不会被释放。

动态内存分配是一个很大的主题,这个答案只是浮出水面。一些阅读的时间。