我想分配2D数组,正在考虑两种可能性(Arduio上为avr-gcc):
A:
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)
)void *
)请参阅In what cases do I use malloc and/or new?,以获取有关此问题的更多讨论。
如果要分配一个二维数组,并且在编译时已知最右边的大小(即,它是一个常数表达式-constexpr
,那么就不需要循环。
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;
int (*arr)[10] = malloc(5 * sizeof(*arr));
这将分配数组,类似于arr[5][10]
(仅在索引意义上。)>
要同时使用它们的元素,请使用:
arr[a][b]
要释放它,基本上可以这样做:
free(arr);
[在C ++中,您还需要注意强制转换并可能用
std
对其进行限定,因此它是std::malloc
(尤其是如果包含cstdlib
,因为在C ++标准中不推荐使用stdlib.h
标头):
const int N = 10; int (*arr)[N] = static_cast<int (*)[N]>(std::malloc(5 * sizeof(*arr)));
但我认为您不会喜欢它。
如果您使用的是C ++编译器(和Arduino草图are
A和B基本相等。