用静态替换动态分配

时间:2018-02-07 21:03:29

标签: c++ arrays dynamic-allocation static-allocation

我有一个项目,我必须定义一个不同维度的数组数组(如三角形),因为我不允许使用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];
}

会做到这一点。但事实并非如此。相反,当我遍历数组并打印内容时,我得到了垃圾。那么,如何用静态分配替换动态分配呢?

2 个答案:

答案 0 :(得分:3)

所以,如果你想要&#34;阵列数组&#34;简化后,您的选择是阵列线性化。这意味着您应该声明70个元素的单个数组,而不是每个10个项目的7个数组。然后,只需使用一个函数来更改嵌套索引,该函数计算线性化数组中的结果移位和中提琴!

您可以在此处找到以下示例之一:How to map the indexes of a matrix to a 1-dimensional array (C++)?

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

答案 1 :(得分:0)

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