我想分配2D数组,我正在考虑两种可能性(Arduio上的avr-gcc):
:
int **arr = new int*[5];
for(int i = 0 ; i < 5 ; i++){
arr[i] = new int[10];
}
B:
int **arr = malloc(5 * sizeof(int *));
for(int i = 0 ; i < 5 ; i++) {
arr [i] = malloc(10* sizeof(int))
}
A和B有什么不同吗?编译器会在这两种情况下(arv-gcc)创建相同的字节码吗?
在C中,您不能通过new
分配内存,因为没有这样的事情。对于c++,您可能更喜欢new
,原因如下:
- 例外(除非明确添加
(std::nothrow)
) - 初始化列表(c++ 11起)
- 更好的安全性,因为它返回正确类型的指针(特别是不是
void *
) - 更干净的语法(但这纯粹是主观的)
参见在什么情况下使用malloc和/或new?关于那件事的更多讨论。
如果你想分配一个二维数组,并且最右边的大小在编译时是已知的(即它是一个常量表达式- constexpr
),那么你不需要循环。
c++新特性
int (*arr)[10] = new int [2][10];
如果您希望它预先设置为零(即,像std::calloc
),则使用:
int (*arr)[10] = new int [2][10]{0}; // C++11
int (*arr)[10] = new int [2][10](); // C++03
就像任何由new[]
分配的数组一样,有一个相应的delete[]
操作符来释放它:
delete[] arr;
C和c++中的Malloc
int (*arr)[10] = malloc(5 * sizeof(*arr));
分配数组,类似于arr[5][10]
(仅在索引意义上)。
要访问这两个元素,只需使用:
arr[a][b]
要释放它,基本上可以这样做:
free(arr);
在c++中,你还需要注意转换,并可能用std
来限定它,所以它是std::malloc
(特别是如果包括cstdlib
,因为stdlib.h
头在c++标准中已被弃用):
const int N = 10;
int (*arr)[N] =
static_cast<int (*)[N]>(std::malloc(5 * sizeof(*arr)));
但是我认为你不会喜欢它。
如果您正在使用c++编译器(和Arduino草图是 c++),你应该更喜欢new
。做一个简单的int
数组不太可能有什么关系,但我只会为具有的代码在C环境中运行留下C遗留的东西。
现在c++程序员(那些从不全心全意从C过渡到c++的奇怪程序员)绝对没有理由存在:-)
A和B基本上是等价的。
编译器可以创建也可以不创建相同的代码(顺便说一句,不是字节码)。但通常使用new
操作符只是简单地归结为对malloc
的调用。要找出答案,请使用gcc -S
编译程序并查看程序集输出。
但是对于c++程序,你应该选择new
而不是malloc
。