多维数组——malloc vs new

Multidimensional Arrays - malloc vs new

本文关键字:vs new malloc 数组      更新时间:2023-10-16

我想分配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