C 未初始化的指针变量的用途是什么?
我在一次采访中被问到这个问题 如果存在一个已声明但未初始化的指针,如下所示:C 未初始化的指针变量的用途是什么?,c,C,我在一次采访中被问到这个问题 如果存在一个已声明但未初始化的指针,如下所示: int*ptr 是否为其指定了默认值?或者它将是一个空指针?另外,如果我们尝试使用如下指针,会发生什么情况: if(ptr) { //代码块 } 如果条件通过了吗?此外,这是否适用于调试/发布构建 我试着在家里运行这个程序,发现如果条件通过,并且如果我试着像这样打印ptr的值: printf(“%x%d”,ptr,*ptr) 它打印一些随机值,但不会使程序崩溃。这背后的解释是什么?如果它是一个全局变量(或静态),它将被
int*ptr代码>
是否为其指定了默认值?或者它将是一个空指针?另外,如果我们尝试使用如下指针,会发生什么情况:
if(ptr)
{
//代码块
}
如果条件通过了吗?此外,这是否适用于调试/发布构建
我试着在家里运行这个程序,发现如果
条件通过,并且如果我试着像这样打印ptr的值:
printf(“%x%d”,ptr,*ptr)代码>
它打印一些随机值,但不会使程序崩溃。这背后的解释是什么?如果它是一个全局变量(或静态
),它将被隐式初始化为NULL
。否则,其值未定义。因此,if
语句的行为是未定义的(即,您不能假设它可能会做什么)。第二个示例的行为也未定义(它可能导致分段错误)
未初始化的指针被认为是危险的;想象一下这个代码的后果:
int *ptr;
...
*ptr = 42; // Dereference pointer and trash somewhere random in memory
但请注意,这可能不会崩溃;它可能会默默地腐蚀事物
所以惯例是总是显式地初始化它,指向有用的东西。如果这是不可能的(例如,您还没有要指向的内容),您可以做的下一件最好的事情是将其初始化为NULL
。取消引用NULL
指针将在大多数平台上引发分段错误,这至少有助于跟踪错误。如果是全局变量(或static
),它将被隐式初始化为NULL
。否则,其值未定义。因此,if语句的行为是未定义的(即,您不能假设它可能会做什么)。第二个示例的行为也未定义(它可能导致分段错误)
未初始化的指针被认为是危险的;想象一下这个代码的后果:
int *ptr;
...
*ptr = 42; // Dereference pointer and trash somewhere random in memory
但请注意,这可能不会崩溃;它可能会默默地腐蚀事物
所以惯例是总是显式地初始化它,指向有用的东西。如果这是不可能的(例如,您还没有要指向的内容),您可以做的下一件最好的事情是将其初始化为
NULL
。取消对NULL
指针的引用将在大多数平台上引发分段错误,这至少有助于跟踪错误。未初始化的指针有利于安全漏洞,并可能有助于植入随机数生成器
如果指针已初始化为NULL
(0),则if
条件只会跳过代码块
由于默认情况下未定义初始化值,因此通常认为初始化为NULL
是良好的做法
您的
printf
语句只是说明了一个事实,即它默认为NULL以外的值,在本例中,它是一个可以取消引用的有效内存区域。未初始化的指针有利于安全漏洞,并可能有助于植入随机数生成器
如果指针已初始化为NULL
(0),则if
条件只会跳过代码块
由于默认情况下未定义初始化值,因此通常认为初始化为NULL
是良好的做法
您的printf
语句只是说明了一个事实,即它默认为NULL以外的值,在本例中,它是可以取消引用的有效内存区域
未初始化的指针变量有什么好处
效率。如果C自动初始化指向NULL
的指针,则会浪费整个CPU指令(如果变量必须存储在主存而不是寄存器中,则可能会浪费更多),这对于C语言的设计者来说是不可接受的。你相信现在的程序员会为了节省几个小时的调试而牺牲宝贵的运行时间吗
未初始化的指针变量有什么好处
效率。如果C自动初始化指向
NULL
的指针,则会浪费整个CPU指令(如果变量必须存储在主存而不是寄存器中,则可能会浪费更多),这对于C语言的设计者来说是不可接受的。你相信现在的程序员会为了节省几个小时的调试而牺牲宝贵的运行时间吗?“并可能有助于植入随机数生成器”-假设熵估计值为0。如果有评论指出这就是它未初始化的原因,因此没有人运行valgrind,则init为null,并打开一个新的安全漏洞(),尽管该漏洞很复杂。Debian bug涉及签入,该签入删除了添加种子数据的两个操作。其中一个贡献的数据总是未初始化的,并导致valgrind/purify错误。移除它是安全的,因为它不是播种过程的基本部分。另一个操作提供的数据通常不是未初始化的,在初始化数据的情况下,它对安全性至关重要。但是这一行看起来很像另一行,所以当另一行(可能正确地)被删除时,它(肯定不正确地)也被删除了。底线是,用未初始化的数据为RNG设定种子不能成为RNG安全性的基础,因为未初始化的数据不适合作为种子值。但把它放在一些适当的随机数据上并没有任何害处。这取决于你们用RNG做了什么。对于蒙特卡罗模拟,这是可以的。对于密码学来说,它不是。”并且可能有助于播种随机数