我正在使用c ++,我想使用二维动态数组。我试过这个:
#include<iostream.h>
using namespace std;
void main(){
int const w=2;
int size;
cout<<"enter number of vertex:\n";
cin>>size;
int a[size][w];
for(int i=0; i<size; i++)
for(int j=0; j<w; j++){
cin>>a[i][j];
}
}
但没有措辞。 我试过这个:
int *a = new a[size][w];
而不是
int a[size][w];
但没有奏效!
你能帮助我吗?非常感谢。
答案 0 :(得分:4)
这里正确的方法是在一个提供良好界面的类中封装一些标准容器,它们将为您管理内存。常见的方法是operator()
的重载采用两个参数来确定矩阵中的行和列。
除此之外,您尝试手动创建的是一个动态大小的数组,其大小为常量2.借助typedef
,您可以以简单易懂的方式编写它:
const int w = 2;
typedef int array2int[w];
int size = some_dynamic_value();
array2int *p = new array2int[size];
如果没有typedef
,语法会更复杂,但可行:
int (*p)[w] = new int [size][w];
在这两种情况下,您都会使用相同的简单语句释放内存:
delete [] p;
与执行双指针(int **
)的方法的不同之处在于,数组的内存布局实际上是二维数组的内存布局,而不是跳转表到多个单独分配的一维数组,提供更好的数据的位置。分配数量较少:一次分配与size + 1
分配,减少了内存碎片。它还减少了内存泄漏的可能性(分配了一个指针,要么泄漏所有内容,要么根本不泄漏)。
答案 1 :(得分:2)
对于动态大小的数组,您必须动态分配它。而不是
int *a = new a[size][w];
使用
int** a = new int*[size];
for(int i = 0; i < size; i++)
a[i] = new int[w];
答案 2 :(得分:1)
答案 3 :(得分:1)
int main() {
const int w = 2;
int size = 10;
int* arr[w];
for (int i = 0; i < w; ++i)
arr[i] = new int[size];
//do whatever with arr..
//std::cout<<arr[0][0];
for (int i = 0; i < w; ++i)
for (int j = 0; j < size; ++j)
std::cout<<arr[i][j];
for (int i = 0; i < w; ++i)
delete[] arr[i];
return 0;
}