代码中未初始化的指针

mun*_*ish 30 c++ pointers null-pointer

我正在学习C++,并且我开始知道指针如果保持未初始化可能指向内存中的随机位置并产生内存可能被其他程序使用的问题.

现在,如果是这种情况,我们就不应该在代码的任何部分使用这一行:

int* ptr;
Run Code Online (Sandbox Code Playgroud)

相反,我们应该有类似的东西

int* ptr = NULL; //Is this going to avoid the problem
Run Code Online (Sandbox Code Playgroud)

请建议,因为我int* ptr;在很多书中看过第一行(),所以我对此表示怀疑.如果可能的话也举一些例子.

Dou*_* T. 36

int* ptr = NULL; //Is this going to avoid the problem
Run Code Online (Sandbox Code Playgroud)

这将导致ptr指向NULL,你可以明确地检查作为缺省/未初始化值.它可以防止您描述的问题,但粗心的程序员仍然可以在不检查的情况下意外取消引用空指针,从而导致未定义的行为.

主要优点是您可以方便地检查是否ptr已经初始化为任何东西,即:

 if (ptr != NULL)
 {
     // assume it points to something
 }
Run Code Online (Sandbox Code Playgroud)

因为这非常惯用,所以不初始化指针是非常危险的NULL.指针将初始化为非NULL垃圾值,并不真正指向任何真实的垃圾值.最糟糕的是,上面的检查会通过,如果发生指针中的地址是您可以合法访问的内存,则会导致更严重的问题.在某些嵌入式环境中,您可能能够访问内存的任何部分,因此可能会意外损坏内存的随机部分或执行代码的随机部分.

  • 如果这样做,记住通过在释放指针时再次设置为NULL来一致地执行此操作也很重要.否则,您无法安全地假设非NULL指针是可解除引用的. (2认同)

jal*_*alf 9

始终初始化变量.

有时,您可能希望初始化为NULL,但大多数情况下,您应该能够初始化指向它应该保留的值的指针.尽可能晚地声明变量,并在该点初始化它们,而不是代码中的15行.


Dat*_*ham 6

这条线:

int* ptr;
Run Code Online (Sandbox Code Playgroud)

绝对不能保证将指针值初始化为特定的任何东西.这条线:

int* ptr = NULL;
Run Code Online (Sandbox Code Playgroud)

将指针初始化为指向零地址,这实际上将永远不会保留任何有用的东西,并且通常会将其作为无效指针值进行检查.

当然,正如Doug T.所说,仍然有可能尝试使用这个指针而不检查它,所以它会崩溃所有相同.

明确初始化为NULL有责任确保其设置为有用的东西之前取消引用指针会崩溃,这其实是一件好事,因为它可以防止代码从"意外",而掩盖一个严重的错误工作的优势.