代码之家  ›  专栏  ›  技术社区  ›  Aditya Bhardwaj

使用malloc函数一次将所有未初始化的变量初始化为0

  •  0
  • Aditya Bhardwaj  · 技术社区  · 1 年前

    这个 malloc 函数不应该将任何值初始化为它所使用的任何变量,比如 calloc 函数确实如此。那么,为什么在使用 malloc 在程序中运行一次?

    以下是重现该问题的代码:-

    #include <stdlib.h>
    #include <stdio.h>
    
    int main() {
      int* ptr = malloc(sizeof(int));
    
      int some_variable;
      printf("%d\n", some_variable); // prints 0
    
      return 0;
    }
    

    需要打印一些垃圾值,但得到了0。即使 malloc 是否将0分配给每个未序列化的内存块,像这样的变量如何 some_variable ,完全超出功能范围受到影响?

    1 回复  |  直到 1 年前
        1
  •  1
  •   ikegami Gilles Quénot    1 年前

    C17§6.3.2.1 2除非它是的操作数 sizeof 运算符,一元 & 操作员 ++ 操作员 -- 的左操作数。运算符或赋值运算符,不具有数组类型的左值被转换为存储在指定对象中的值(并且不再是左值);这叫做 左值转换 。如果左值具有限定类型,则该值具有该左值的类型的非限定版本;此外,如果左值具有原子类型,则该值具有左值类型的非原子版本;否则,该值具有左值的类型。如果左值的类型不完整且没有数组类型,则行为未定义。 如果左值指定了一个自动存储持续时间的对象,该对象本可以用声明 register 存储类(从未获取其地址),并且该对象未初始化(未使用初始化器声明,并且在使用之前未执行任何赋值),则行为未定义。

    强调我的。

    您的代码的行为是未定义的。它可以做任何事情。而且它不必是一致的。这种行为甚至可能在两次跑步之间发生变化。

    它可以打印零。它可能会删除你的文件。这些都是它可以做的事情,因为它可以做任何事情。