C++ 关于指针和数组以及它们在C+中的内存分配方式+;

C++ 关于指针和数组以及它们在C+中的内存分配方式+;,c++,arrays,pointers,memory-management,C++,Arrays,Pointers,Memory Management,所以我试图解决这个问题: 数据以以下输入格式输入。第一行包含两个空格分隔的整数,表示可变长度数组的数量,n,以及查询的数量,q。后续行的每一行都包含一个空格分隔的格式序列 k Ai[0]Ai[1]…Ai[k-1] 其中,k是数组的长度,Ai,后跟Ai的k元素。随后的每一行都包含两个空格分隔的整数,用于描述查询的数组编号(范围从0到n-1)和该特定数组中的索引(范围从0到ki)的各自值。i、 e,给定以下输入: 这一产出是预期的 我基本上是C++初学者。这是我尝试过的代码,但我觉得每个后续数组的存

所以我试图解决这个问题:

数据以以下输入格式输入。第一行包含两个空格分隔的整数,表示可变长度数组的数量,
n
,以及查询的数量,
q
。后续行的每一行都包含一个空格分隔的格式序列

k Ai[0]Ai[1]…Ai[k-1]

其中,k是数组的长度,Ai,后跟Aik元素。随后的每一行都包含两个空格分隔的整数,用于描述查询的数组编号(范围从0到n-1)和该特定数组中的索引(范围从0到ki)的各自值。i、 e,给定以下输入:

这一产出是预期的

我基本上是C++初学者。这是我尝试过的代码,但我觉得每个后续数组的存储地址给了我一些问题

int main(){
    int n, q;
    scanf("%d %d", &n, &q);
    printf("n,q = %d, %d\n", n, q);
    int* row[n];
    for (int i = 0; i < n; i++){
        int k;
        scanf("%d", &k);
        printf("k = %d\n", k);
        int col[k];
        row[i] = col;
        for (int j = 0; j < k; j++){
            int elem;
            scanf("%d", &elem);
            printf("i,j,elem = %d, %d, %d\n", i, j, elem);
            col[j] = elem;
            cout << "address is " << &(col[j]) << "\n";
        }
    }
    for (int query = 1; query <= q; query++){
        int i, j;
        scanf("%d %d", &i, &j);
        int answer;
        answer = *(row[i] + j);
        printf("row[%d][%d] is %d\n", i, j, answer);
        cout << "address is " << &answer << "\n";
    }
    return 0;
}

基本上,我发现数组地址是重叠的。此外,解引用的答案计算会导致意外的输出。请对此处所犯错误进行任何解释。

这里有一个主要问题:

for (int i = 0; i < n; i++){
    ...
    int col[k];
    row[i] = col;
    ...
}
for(int i=0;i
变量
col
的作用域仅在循环内。一旦循环迭代,变量就不再存在。当您尝试取消引用指针时,存储指向它的指针将导致未定义的行为

简单的解决方案可能是使用
malloc
col
动态分配内存


<>错过了这个问题被标记为C++,并且混淆了,因为源实际上不使用任何C++特定代码。这种情况使它变得更糟糕,因为它不是C++的一部分。有些编译器将它作为扩展,但在C++编程时不应使用它。
相反,您应该使用,然后您可以轻松地解决您的问题,而无需自己的动态分配。然后,可以编写<代码>行> <代码>向量>向量> int >代码> <代码> COLL/CONT> >代码> int >代码>,然后赋值将工作良好(如果<代码>行< /代码>已设置为正确的大小)。

< P>一个使用C++而不必占用太多内存管理错误的简单方法是使用标准库类型。把裸露的金属材料留给那些没有这些的可怜的C族;)

因此,不要干预
new[]
delete[]
,而是使用类似
std::vector
的类型

下面的“现代C++版本”没有充分的理由使用iostream。旧的
stdio.h
有时是首选,有时也是
iostream
。有时这只是风格和品味的问题

#include <vector>
#include <iostream>
#include <fstream>

typedef struct Q
{
    int iArray;
    int iIndex;
} Q_t;

typedef std::vector<std::vector<int> > Data_t;
typedef std::vector<Q_t> Query_t;

bool Load(Data_t& data, Query_t &queries, std::istream& is)
{
    size_t ndata = 0;
    size_t nqueries = 0;
    is >> ndata;
    is >> nqueries;
    data.resize(ndata);
    queries.resize(nqueries);

    for (size_t d = 0; d < ndata; d++)
    {
        size_t l = 0;
        is >> l;
        data[d].resize(l);
        for (size_t i = 0; i < l; i++)
        {
            is >> data[d][i];
        }
    }

    for (size_t q = 0; q < nqueries; q++)
    {
        is >> queries[q].iArray;
        is >> queries[q].iIndex;
    }
    return true;
}


int main(int argc, const char * argv[])
{
    std::ifstream input("E:\\temp\\input.txt");
    Data_t data;
    Query_t queries;
    if (Load(data, queries, input))
    {
        for (auto &q : queries)
        {
            std::cout << data[q.iArray][q.iIndex] << std::endl;
        }
    }
    return 0;
}
#包括
#包括
#包括
类型定义结构Q
{
国际射线;
国际指数;
}Q_t;
typedef std::矢量数据;
typedef std::向量查询;
bool加载(数据和数据、查询和查询、std::istream和is)
{
尺寸数据=0;
大小查询=0;
是>>水田;
is>>Nquiries;
数据。调整大小(数据);
查询。调整大小(nquerys);
对于(大小d=0;d>l;
数据[d]。调整大小(l);
对于(大小i=0;i>数据[d][i];
}
}
对于(大小=0;q>查询[q].iArray;
is>>查询[q].iIndex;
}
返回true;
}
int main(int argc,const char*argv[]
{
std::ifstream输入(“E:\\temp\\input.txt”);
数据;
查询;
if(加载(数据、查询、输入))
{
用于(自动和q:查询)
{

std::cout错误在于,您使用了“col”数组,该数组在for循环完成后失去作用域。您可以通过使用动态内存分配将其声明在for循环之外来解决此问题

希望下面的代码能帮助您获得想法:)

#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
int n,q;
cin>>n;
cin>>q;
int*行[n];
int*col;
对于(int i=0;i>k;
col=新整数[k];
行[i]=列;
对于(int j=0;j>col[j];
}
}
对于(int query=0;query>i;
cin>>j;

CUT<代码> int k;.. int COL[k]; >允许在C非C++中。<代码> CUT<代码>允许在C++中而不是在C中。我建议将标签更改为C,但发现 CUT……是唯一使用C++的东西。
n,q = 3, 3
k = 3
i,j,elem = 0, 0, 1
address is 0x7ffe236edb70
i,j,elem = 0, 1, 2
address is 0x7ffe236edb74
i,j,elem = 0, 2, 3
address is 0x7ffe236edb78
k = 5
i,j,elem = 1, 0, 4
address is 0x7ffe236edb60
i,j,elem = 1, 1, 5
address is 0x7ffe236edb64
i,j,elem = 1, 2, 6
address is 0x7ffe236edb68
i,j,elem = 1, 3, 7
address is 0x7ffe236edb6c
i,j,elem = 1, 4, 8
address is 0x7ffe236edb70
k = 4
i,j,elem = 2, 0, 9
address is 0x7ffe236edb60
i,j,elem = 2, 1, 10
address is 0x7ffe236edb64
i,j,elem = 2, 2, 11
address is 0x7ffe236edb68
i,j,elem = 2, 3, 12
address is 0x7ffe236edb6c
row[0][1] is 32766
address is 0x7ffe236edbcc
row[1][3] is 32766
address is 0x7ffe236edbcc
row[2][0] is 3
address is 0x7ffe236edbcc
for (int i = 0; i < n; i++){
    ...
    int col[k];
    row[i] = col;
    ...
}
#include <vector>
#include <iostream>
#include <fstream>

typedef struct Q
{
    int iArray;
    int iIndex;
} Q_t;

typedef std::vector<std::vector<int> > Data_t;
typedef std::vector<Q_t> Query_t;

bool Load(Data_t& data, Query_t &queries, std::istream& is)
{
    size_t ndata = 0;
    size_t nqueries = 0;
    is >> ndata;
    is >> nqueries;
    data.resize(ndata);
    queries.resize(nqueries);

    for (size_t d = 0; d < ndata; d++)
    {
        size_t l = 0;
        is >> l;
        data[d].resize(l);
        for (size_t i = 0; i < l; i++)
        {
            is >> data[d][i];
        }
    }

    for (size_t q = 0; q < nqueries; q++)
    {
        is >> queries[q].iArray;
        is >> queries[q].iIndex;
    }
    return true;
}


int main(int argc, const char * argv[])
{
    std::ifstream input("E:\\temp\\input.txt");
    Data_t data;
    Query_t queries;
    if (Load(data, queries, input))
    {
        for (auto &q : queries)
        {
            std::cout << data[q.iArray][q.iIndex] << std::endl;
        }
    }
    return 0;
}
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


int main() {
    int n, q;
    cin >> n;
    cin >> q;
    int* row[n];
    int* col;
    for(int i=0; i<n; i++)
    {
        int k;
        cin >> k;
        col = new int[k];
        row[i] = col;
        for(int j=0; j<k; j++)
        {
            cin >> col[j];
        }
    }
    for(int query=0; query<q; query++)
    {
        int i,j;
        cin >> i;
        cin >> j;
        cout << row[i][j] << endl;
    }
delete[] col;
    return 0;
}