【问题标题】:Allocating a block of memory with malloc() [duplicate]使用 malloc() 分配一块内存 [重复]
【发布时间】:2014-04-24 18:49:36
【问题描述】:

我有一个很不寻常的问题。 我已经看到了向 malloc 传递参数的两种变体。假设我们有:

int *arr = (int *) malloc(sizex * sizeof(*arr));

有人说使用sizeof(*arr) 不好,你应该改用sizeof(int)(在这个例子中)。 你能解释一下有什么区别,什么更好用吗?

【问题讨论】:

  • 如果您需要从 int 更改为,例如,float,如果您使用第一种技术 (sizeof(*arr)),则无需进行太多更改。另外,不要投你的malloc
  • 也不要从malloc() 投回。
  • 为了好玩,你甚至可以写int *arr = malloc(sizex * sizeof(arr[100]));
  • @pmg,sizeof (arr[0]) 是零吗?

标签: c arrays pointers malloc


【解决方案1】:

没有区别。两者都分配相同数量的内存 -

int *arr = (int *) malloc(sizex * sizeof(*arr));
// equivalent to
int *arr = (int *) malloc(sizex * sizeof(int));

但是,有一些事情需要注意。

  1. 您不应该转换malloc 的结果。如果您忘记包含包含其原型的标头stdlib.h,它没有用,实际上可能会导致问题。请阅读 - Do I cast the result of malloc?

  2. 我更喜欢上面的第一个版本,因为没有重复类型信息。此外,从某种意义上说,它更易于维护,如果您更改类型,那么您只需要更改一次,而在第二种情况下,您需要在两个地方进行更改。

需要注意的是sizeof只有在它是一个类型的时候才需要为它的操作数加上括号。因此,可以更简洁地写成

int *arr = malloc(sizex * sizeof *arr); 
// equivalent to
int *arr = malloc(sizex * sizeof(*arr));  // preferred way

【讨论】:

  • 我喜欢将 sizeof 的括号视为需要括号的类型(就像它是一个演员表)。
  • @pmg,这实际上是标准中的描述。
  • @pmg 我认为这是个人选择。我认为,去掉一对括号会使代码更简洁一些。
  • 我不喜欢多余的括号。我的意思是括号属于类型,而不是运算符。
  • @pmg 是的。现在我认为括号可能会使代码更具可读性,避免潜在的混淆。我会包括它,但我需要与风格保持一致。
猜你喜欢
  • 2020-11-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 2012-12-26
  • 2012-02-26
  • 1970-01-01
相关资源
最近更新 更多