C++ 创建一个指向不同数组的数组

C++ creating an array pointing to different arrays

该程序的输入如下:

2 2
3 1 5 4
5 1 2 8 9 3
0 1
1 3

我希望n是一个指向其他整数数组的数组。所以,n 本质上应该是 {{1, 5, 4}, {1, 2, 8, 9, 3}}。如果我想访问第 0 个数组和第 1 个索引,值应该 return 5,如果我要访问第 1 个数组和第 3 个索引,值应该是 9 .

但是,此代码 return 的值是 3276432764

#include <cstdio>
#include <iostream>
using namespace std;

int main() {
    int n_l; // integer variable that will hold the length of array n
    int q_l; // integer variable that will hold the length of the number of queries
    cin >> n_l >> q_l; // assigns values to the variables n_l and q_l
    int *n[n_l]; // creates an array that will contain pointers
    for (int i = 0; i < n_l; i++){ // loops through the length of array n 
        int amount; // declares the variable amount
        cin >> amount; // assigns a value to the variable amount
        int k[amount]; // creates one of the arrays that will be added to n
        for (int x= 0; x < amount; x++){ // loops through the length of k and assigns a value to each index
            cin >> k[x];
        }
        n[i] = k; // adds the array k to the position in array n
    }
    
    for (int i = 0; i < q_l; i++){
        int arraynum;
        int index;
        cin >> arraynum >> index;
        cout << n[arraynum][index] << endl;
    }   
}

您正在 for 循环中定义您的数组,其范围将在该循环中受到限制,请尝试使用 new 为数组分配区域并将新分配区域的地址保存到您的指针数组。

for (int i = 0; i < n_l; i++){ // loops     through the length of array n 
    int amount; // declares the variable amount
    cin >> amount; // assigns a value to the variable amount
    int *k = new int[amount]; 
    for (int x= 0; x < amount; x++){ // loops through the length of k and assigns a value to each index
        cin >> k[x];
    }
    n[i] = k; // adds the array k to the position in array n
}

完成后,别忘了删除分配的区域:

for(int i = 0; i < n_l; i++)
    delete[] n[i];

对于初学者来说,可变长度数组不是标准的 C++ 功能

int *n[n_l];

您可以使用 std::vector<int *>。或者您可以使用 std::vector<std::pair<int, int *>>,其中该对的第一个元素存储动态分配数组中的元素数,该对的第二个元素存储指向动态分配数组的指针。

此外,数组将包含无效指针,因为在 for 循环中声明的数组

int k[amount]; 

退出for循环后不会存活

所以至少你必须在 for 循环中动态分配数组。

并且在访问动态分配数组的元素之前,您需要检查输入的索引对于给定数组是否有效。

cin >> n_l >> q_l; // assigns values to the variables n_l and q_l
int *n[n_l];

这在 C++ 中是不允许的。数组变量的大小必须是编译时常量。您可以创建动态数组。最方便的方法是使用标准库中的 std::vector class 模板。

你的指针的问题是你在循环中创建的自动数组在循环语句结束时自动销毁,数组中的指针都是指向销毁数组的悬空(即无效)指针。当您稍后通过无效指针间接访问时,程序的行为是未定义的。

您需要多个数组。创建多个对象的好方法是什么?数组是创建多个对象的好方法。因此,为了创建多个数组,您可以创建一个数组数组。或者,由于您需要动态大小,您可以创建一个向量向量。以下是如何创建向量向量的示例:

std::vector<std::vector<int>> n(n_l);
for(auto& vec : n) {
    int amount;
    std::cin >> amount;
    vec.resize(amount);
    for(auto& i : vec) {
        cin >> i;
    }
}

您可以在向量的向量中创建指向向量中的数组的指针向量,但那将毫无意义。你不需要指针。