0

我有一个项目,我必须定义一个不同维度的数组(如三角形),因为我不允许使用 std::vector 或其他容器类。为此,我使用了一个指针数组。通常,我会这样做:

int* triangle[n]; 
for(int i = 0; i < n; i++) {
    triangle[i] = new int[i + 1];
    for(int j = 0; j <= i; j++) cin >> triangle[i][j];
}

但是我一定不能使用动态内存!我以为这样做

int* triangle[n];
for(int i = 0; i < n; i++) {
    int row[i + 1];
    triangle[i] = row;
    for(int j = 0; j <= i; j++) cin >> triangle[i][j];
}

会成功的。但它没有。相反,当我遍历数组并打印内容时,我得到了垃圾。那么,如何用静态分配替换动态分配?

4

2 回答 2

3

所以,如果你想简化“数组数组”,你的选择是数组线性化。这意味着您应该声明一个包含 70 个元素的数组,而不是 7 个数组,每个数组包含 10 个元素。然后,只需使用计算线性化数组的结果移位的函数更改嵌套索引,中提琴!

在这里您可以找到这样的示例之一:如何将矩阵的索引映射到一维数组 (C++)?

如果您事先不知道您的数组有多长,那么确定初步预留大小可能是一个艰难的选择(例如,像 vector 等 STL 容器会做同样的事情:它们分配一块内存然后增长容器直到剩余可用容量,然后重新分配更大的块,将数据从旧缓冲区移动到新缓冲区,一次又一次,一次又一次......)

于 2018-02-07T21:13:02.523 回答
0

正如@BeyelerStudios 在评论中指出的那样,在 for 循环结束时,为row数组分配的内存被释放。当我试图打印出内容时,我正在取消引用指向这个释放内存的指针,所以我得到了垃圾。谢谢!

于 2018-02-07T21:16:01.520 回答