多维数组 - malloc vs new

Mac*_*las 1 c c++ malloc arduino avr-gcc

我想分配2D数组,我正在考虑两种可能性(Arduio上的avr-gcc):

A:

int **arr = new int*[5];
for(int i = 0 ; i < 5 ; i++){
   arr[i] = new int[10];
}
Run Code Online (Sandbox Code Playgroud)

B:

 int **arr = malloc(5 * sizeof(int *));
 for(int i = 0 ; i < 5 ; i++) {
    arr [i] = malloc(10* sizeof(int))
 } 
Run Code Online (Sandbox Code Playgroud)

A和B之间有什么区别吗?编译器会在这两种情况下创建相同的字节代码(arv-gcc)吗?

Grz*_*ski 6

在C中,你不能分配内存new,因为没有这样的东西.对于C++,您可能更喜欢new以下几个原因:

  • 例外(除非你(std::nothrow)明确地添加)
  • 初始化列表(自C++ 11起)
  • 更好的安全性,因为它返回适当类型的指针(特别是不void *)
  • 更清晰的语法(但这是纯粹主观的)

请参阅在什么情况下我使用malloc vs new?关于这个问题的更多讨论.

如果你想分配二维数组并且在编译时至少知道最大尺寸(即它可以是常量表达式),那么你就不要循环了.

C++新手

int (*arr)[10] = new int [2][10];
Run Code Online (Sandbox Code Playgroud)

如果你想用零预设(也就是说std::calloc),那么使用:

int (*arr)[10] = new int [2][10]{0}; // C++11
int (*arr)[10] = new int [2][10]();  // C++03
Run Code Online (Sandbox Code Playgroud)

就像分配的任何数组一样new[],有一个相应的delete[]运算符来释放它:

delete[] arr;
Run Code Online (Sandbox Code Playgroud)

C和C++中的Malloc

int (*arr)[10] = malloc(5 * sizeof(*arr));
Run Code Online (Sandbox Code Playgroud)

这会分配数组,就像arr[5][10](仅在索引意义上).

要在两者中访问其元素,只需使用:

arr[a][b]
Run Code Online (Sandbox Code Playgroud)

要释放它,你基本上做:

free(arr);
Run Code Online (Sandbox Code Playgroud)

在C++中,你还需要处理强制转换并可能使用它来限定它std,因此它std::malloc(特别是如果包含cstdlib,因为stdlib.h在C++标准中不推荐使用标头):

const int N = 10;

int (*arr)[N] =
    static_cast<int (*)[N]>(std::malloc(5 * sizeof(*arr)));
Run Code Online (Sandbox Code Playgroud)

但我不认为你会喜欢它.

  • 不幸的是,在C++中你需要转换malloc (2认同)