我正在尝试使用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个值,它就会崩溃。你能明白为什么吗?
答案 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;迭代,您为动态数组分配新内存,实际上失去了对先前分配的动态单维数组的访问权。
这是一个非常棒的网站,用于学习动态内存分配:
答案 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
}