【问题标题】:What is the initial value of dynamic memory动态内存的初始值是多少
【发布时间】:2023-03-29 06:15:01
【问题描述】:

当我在 C 中使用 malloc 系列的函数动态分配内存时,是否有一些规则(来自 C 标准或操作系统的内部工作原理)关于该内存的初始值是多少?

int* ptr = malloc(sizeof (*ptr));
bool b = *ptr == 0;  // always true?

【问题讨论】:

  • 不。 calloc?是的。
  • 取决于。不会依赖它。您可以随时使用callocstackoverflow.com/questions/1538420/…
  • @MikeCAT:据我所知,在没有初始化的情况下使用malloc() 的结果只是在使用“陷阱表示”的系统上的未定义行为,当涉及的类型是整数时,就像在这里的问题,基本上不会发生在任何实际系统中。因此,虽然它在某些假设的计算机上在技术上可能是未定义的行为,但我认为这个问题的代码中没有任何真正的 UB 风险。它仍然是无用的代码。
  • 对于这一行:bool b = *ptr == 0; 中的结果值 b 将取决于两个运算符 === 在 C 中的 precedence 优先级每:http://www.swansontec.com/sopc.html,赋值运算符= 的优先级低于二元运算符==,因此它取决于*ptr 的内存中发生了什么由于该指针具有int* 类型,(假设是32 位架构) *ptr 为 0 的几率是 1:4gig。所以b 中的结果很可能是假的,但是,b 中的结果有四分之一的机会是真的

标签: c heap-memory dynamic-memory-allocation


【解决方案1】:

就 C 标准而言,动态分配内存的初始值是不确定的。有些平台可能碰巧给你零,其他平台可能碰巧在任何地方都给你像 0xEE 这样的保护值,但在可移植的 C 程序中都不能依赖这些值。

如果您需要零,最常规的方法是使用calloc(),它有可能在某些平台上得到优化。

【讨论】:

  • calloc 的问题是内存归零,但不保证例如如果 null pointer 值也不为零,则将指针数组设置为 null pointer。所以这也不便携。浮点数和复数也是如此。
  • @Olaf:对于 float 和 double,如果定义了 __STDC_IEC_559__,C99 保证 calloc() 将创建 0.0 值,也就是如果系统使用 IEEE 754。所以很容易添加编译时检查一下,它很可能会传递给这里任何人使用的任何系统。因此理论上不可移植,但无论如何都可以确保正确性。
  • 不,不是每个系统都使用 IEEE754 浮点。实际上,很多系统都没有使用它,或者只是部分实现了它。但我同意,这些系统中的大多数也对0.0 使用全零。您忘记了嵌入式系统和 DSP。但是浮点数不是唯一的问题,对于指针来说,检查起来更复杂,因为根据定义,任何0 到指针的转换都必须匹配NULL。无论如何,都不是重点。我明确地追求可移植性,你也提到过,实际上calloc 也不能保证这一点。这是一个必须牢记的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 2012-09-15
  • 1970-01-01
  • 2022-12-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多