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

Problems with dynamic array creation using pointers

本文关键字:数组 问题 动态 创建 指针      更新时间:2023-10-16

我正在尝试使用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个值,则它会崩溃。你知道为什么吗?

我也遇到了这个问题:

 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/

您是在内部循环中分配内存而不是外循环,如果您的凹痕保持一致,您会抓住的。另外,您使用的是new int(arr[i])而不是new int[arr[i]](前者分配一个INT并将其值设置为arr[i],后者分配了arr[i] INTS的数组。

在第二个循环中,您反复释放堆栈变量,这是双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
}