【问题标题】:(int**)malloc(sizeof(int*))(int**)malloc(sizeof(int*))
【发布时间】:2012-04-15 09:05:50
【问题描述】:

我知道为了malloc一个指向数组的指针数组,语法应该是:

(int**)malloc(numberOfDesiredElements*sizeof(int*))

一不小心忘了把numberOfDesiredElements*放在size前面。它弄乱了我的程序抛出随机分段错误,即有时程序输出正确,有时它出现分段错误。

当我没有说明我想要多少个插槽时,有人可以解释发生了什么吗?

谢谢!

【问题讨论】:

  • 语法不应该是这样的。避免不必要的演员表。
  • malloc 返回一个void*,可以隐式转换为int**。如果您缺少 malloc 的原型,显式转换可能隐藏错误。

标签: c malloc double-pointer


【解决方案1】:

这只是一个普通的乘法,而不是神奇的语法;所以它为 1 而不是 3 分配空间。

【讨论】:

  • 是乘法?哦... T_T 随机段错误呢?
  • @Rafcio:如果您说malloc(sizeof(int)),您将获得足够的内存来存储一个整数。如果您尝试在其中填充多个,则您处于未定义的行为领域-任何事情都可能发生。 (并使用calloc 来避免这种情况。)
  • 如果您假设您有 3 的空间但只有 1 的空间,那么您正在写入被其他东西使用的内存(可能会破坏指针)或者可能是未分配的内存完全没有(段错误)。
  • 对。多谢你们!我想我知道……也许我该收工了:|
【解决方案2】:

更好的写法是

int **p = malloc(numberOfDesiredElements * sizeof *p);

更简洁、更易于阅读,而且您不必担心在sizeof 表达式中保持您的类型。强制转换是不必要的(在 C 中;在 C++ 中是必需的,但您不应该在 C++ 中使用 malloc),并且如果您在范围内没有 malloc 的原型,则可以抑制有用的诊断。

至于当您分配的空间少于预期时会发生什么,嗯,您超出了定义的行为范围。如果你破坏了一些重要的东西,你会得到一个运行时错误。如果您不这样做,您的代码将显示正常工作。

【讨论】:

  • +1 for sizeof *p ... - 尽管关于可读性我更喜欢sizeof (*p)
猜你喜欢
  • 2013-02-19
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 2021-11-22
  • 2021-06-09
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多