多维数组-malloc与新

问题描述 投票:1回答:3

我想分配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++ c arduino malloc avr-gcc
3个回答
6
投票

在C中,您无法按new分配内存,因为没有这种东西。对于C ++,出于以下几个原因,您可能更喜欢new

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

请参阅In what cases do I use malloc and/or 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,因为在C ++标准中不推荐使用stdlib.h标头):

const int N = 10;

int (*arr)[N] =
    static_cast<int (*)[N]>(std::malloc(5 * sizeof(*arr)));

但我认为您不会喜欢它。


4
投票

如果您使用的是C ++编译器(和Arduino草图are


2
投票

A和B基本相等。

© www.soinside.com 2019 - 2024. All rights reserved.