-1

我正在尝试使用数组的值int作为我的指针来创建一个二维动态数组。我不知道如何准确地说出来,所以这里是代码。如果你看到它,也许你会明白我想要做什么。

#include "stdafx.h"
#include <iostream>
using namespace std;

int main(){
    const int length =5;
    int arr[5]={1,1,3,9,1};
    int* AR[length];

    for (int i=0; i<length;i++) {
        for (int j=0; j<(arr[i]); j++){
            AR[i] = new int (arr[i]);
            AR[i][j]=93;
            cout<<"["<<AR[i][j]<<"] ";
        }
        cout<<endl;
    }

    for (int i = 0; i < length; i++) {
        for (int j=0; j<arr[i]; j++) {
            delete[] AR[i];  
            delete []&AR;
        }
    }
    return 0;
}

每当我用arr[] < 4它运行它时,它都能完美运行,但如果大小arr超过 4 个值,它就会崩溃。你能看出为什么吗?

4

2 回答 2

4

我也有这个问题:

 AR[i] = new int[arr[i]] 

或者

 AR[i] = (int *) malloc(sizeof(int) * arr[i])

解释:

 int * a = new int(5);

创建一个整数,将其设置为 5,并返回一个指向它的指针。

 int * a = new int[5];

这为 5 个整数分配空间,并返回指向第一个整数的指针。

编辑: 您的删除也需要调整

 for(int i = 0; i < first_dimension; ++i)
    delete [] AR[i];

 delete [] AR;

编辑 2:正如 Wug 指出的那样,您也有内存泄漏。您的代码现在可以工作,但是每次“j”迭代时,您都会为动态数组分配新内存,这实际上会失去对先前分配的动态单维数组的访问权限。


这是一个学习动态内存分配的超级棒的网站:

http://www.cplusplus.com/doc/tutorial/dynamic/

于 2012-10-23T19:54:43.863 回答
1

您在内部循环而不是外部循环中分配内存,如果您的缩进是一致的,您就会发现这一点。此外,您使用new int(arr[i])而不是new int[arr[i]](前者分配一个 int 并将其值设置为arr[i],后者分配一个 int 数组arr[i]

在您的第二个循环中,您反复释放堆栈变量,这是一个双诺诺 - 您只释放一次分配的内存,并且您不释放在堆栈上声明的变量。

这是清理后的代码:

for (int i = 0; i < length; i++)
{
                             // moved outside of inner loop
    AR[i] = new int[arr[i]]; // used int[arr[i]] instead of int(arr[i])
    for (int j = 0; j < arr[i]; j++)
    {
        AR[i][j] = 93;
        cout << "[" << AR[i][j] << "] ";
    }
    cout << endl;
}

for (int i = 0; i < length; i++)
{
    delete[] AR[i]; // removed incorrect delete statement and incorrect inner loop
}
于 2012-10-23T20:00:48.087 回答