动态2d数组:int(*ptr)[4]=new int[7][4];
dynamical 2d array: int (*ptr)[4] = new int[7][4];
据我所知,动态分配的2d数组应该这样分配:
int **rows = new int*[7];
//for loop assigning all seven rows[i] a "new int[4]"
然而,以下内容也适用于我:
int (*ptr)[4] = new int[7][4]; //create dynamic 2d array
for(int i = 0; i < 7; ++i) //initialize and test
{
for(int j = 0; j < 4; ++j)
{
ptr[i][j] = i + j;
cout << ptr[i][j] << ' ';
}
cout << endl;
}
delete[] ptr;
/*
output:
0 1 2 3
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
*/
为什么我要使用我首先提到的更复杂的方法,当我可以用这一行创建一个动态二维阵列时:
int (*ptr)[4] = new int[7][4];
我很感激任何见解!
(我使用valgrind没有发现内存泄漏。)
为什么我要使用我首先提到的更复杂的方法,当我可以用这一行创建一个动态二维阵列时:
当行中的列数不同时,您可能需要这样做。假设你有一个2D阵列,看起来像:
1 2 3 4 5 6 7 8 9 10
1 2 3 4
9 8 8 5 6 4
对于这种情况,第二种方法不起作用。您需要使用:
p[0] = new int[10];
p[1] = new int[4];
p[2] = new int[6];
int (*rows)[4]
要求4
是编译时常数。如果直到运行时才知道列数,则不能使用此方法。
但是,您不应该使用这两种方法。为了编写安全的代码,应该避免使用原始指针。通过使用适当的容器,内存管理就为您完成了,这意味着您的代码是清晰的,不太可能包含错误。
// Neither rows nor columns known at compile-time
std::vector<std::vector<int>> x(7, std::vector<int>(4));
// columns known at compile-time
std::vector<std::array<int, 4>> x(7);
在这两种情况下,您都可以通过x[5][2]
等访问元素。
相关文章:
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- different between int **arr =new int [ n]; and int a[i][j]?
- 这行代码中的内存是如何分配"int **v = new int*[n]; "的?
- new(std::nothrow) int[n] 抛出异常
- int** a = new int*[n]();这个函数有什么作用?
- "new int * **[10]"做什么?
- 在C++中,为什么int可以使用new运算符初始化变量,而double不能
- 将内存分配给 2D 数组时,“new int*[rowCount];”的含义是什么?是 2D 数组,是指向数组的指针数组
- C++用法:" *(new int); "做什么?
- 为什么在这种情况下使用 int *arr = new int [number]
- int '*p = new int (5);' 和 'int *p = new int[5];' 有什么区别?
- 为什么"new vector<int>[5]"不创建向量数组?
- 崩溃时间(运算符 new(无符号 int)+22)
- 有没有一个不平凡的例子,其中 int* x = new int 实际上是有用的
- "{}" "new int[5]{};"的目的是什么?
- "new int[8]()"相当于C++11中的"new int[8]{}"吗?
- 新的int()和new int []有什么区别
- `delete []`on`int*````new'''给出了malloc错误
- 用new分配4k int后的内存覆盖
- "new int(100)"做什么?