使用指针创建动态数组的问题

时间:2012-10-23 19:50:01

标签: c++

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

#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个值,它就会崩溃。你能明白为什么吗?

2 个答案:

答案 0 :(得分: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指出的那样,你也有内存泄漏。您的代码现在可以使用,但每个&#34; j&#34;迭代,您为动态数组分配新内存,实际上失去了对先前分配的动态单维数组的访问权。


这是一个非常棒的网站,用于学习动态内存分配:

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

答案 1 :(得分:1)

你在内循环而不是你的外循环中分配内存,如果你的缩进是一致的,你会抓住的东西。此外,您使用new int(arr[i])而不是new int[arr[i]](前者分配一个int并将其值设置为arr[i],后者分配一个arr[i]整数数组。

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

这是清理过的代码:

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
}