提问者:小点点

创建指向结构数组的指针数组


数组的大小由用户输入确定,结构数组在for循环中创建。

struct obj{
int h1
int h2
};
int pages;

ifstream in("input21.txt");
string a = "";
in >> a;
pages = stoi(a);
obj* pg[pages];
for(int i = 0; i < pages; i++){ //
    in >> a;
    int x = stoi(a); // # of entries
    in >> a;
    obj list[x];
    pg[i] = list;
    for(int q =0; q < x; q++){
        in >> a;
        list[q].h1 = b2d(stoi(a));
        in >> a;
        list[q].h2 = b2d(stoi(a));
        }
    }`

我不知道如何实现这一点,以及在构建结构之后如何访问结构的每个元素。我该如何开始建造这个结构呢?


共1个答案

匿名用户

我将提供一些提示,但我认为这是一个家庭作业解决方案,所以我会留下一些给你们。

首先,正如Sambalika所说的,obj[x]不受C++标准的支持,尽管您使用的编译器可能支持它。然而,依赖于它是危险的。

您定义的顶部数组:

obj* pg[pages];

除了在标准之外,这还不错。pq[0]是对象*。那很酷。

这可能也没问题:

pg[i] = list;

但是,你所做的。列表是在for-loop的范围内定义的。当循环退出时,它就会消失。一旦循环结束,PQ[0]将指向将被重用的随机内存。

这是个很大的问题。

现在,我不会使用原始数组。我会使用std::vector。

std::vector<std::vector<obj>> myList;

此时,您有了一个列表的动态列表。然后您可以循环(就像您所做的那样)并创建:

std::vector<obj> list;

在内部循环中填充:

obj newObj;
// fill in newobj
list.push_back(newObj);

然后在内部for循环之后:

myList.push_back(list);

Push_back()只是一个append。

有关更多信息,请参阅std::vector的文档和示例。

另一个选择是进入std::shared_ptr,但这是另一个问题。