如何让uninitiated指针不等于0 / null?

时间:2016-11-22 07:50:28

标签: c++ pointers

我是一名c ++学习者。其他人告诉我" uninitiatied指针可能指向任何地方"。如何通过代码证明。我做了一个小测试代码,但我的未经指向的指针总是指向0.在这种情况下,它不指向0?感谢

#include <iostream>
using namespace std;
int main() {
    int* p;
    printf("%d\n", p);
    char* p1;
    printf("%d\n", p1);
    return 0;
}

3 个答案:

答案 0 :(得分:4)

根据定义,任何未初始化的变量都有一个不确定的值,直到提供一个值,甚至访问它是未定义的。因为这是未定义行为的灰色区域,所以你无法保证未初始化的指针不是0

您编写的任何内容都证明了这一点,这取决于您运行的编译器和系统。

如果你真的想,你可以尝试编写一个用垃圾值填充本地数组的函数,并创建另一个定义未初始化指针并打印它的函数。在main()中的第一个函数之后运行第二个函数,您可能会看到它。

编辑:为了您的好奇心,我使用此代码在我的系统上展示了VS2015的行为:

void f1()
{
  // junk
  char arr[24];
  for (char& c : arr) c = 1;
}

void f2()
{
  // uninitialized
  int* ptr[4];
  std::cout << (std::uintptr_t)ptr[1] << std::endl;
}

int main()
{
  f1();
  f2();
  return 0;
}

打印168430090x01010101)。但同样,这都是未定义的行为

答案 1 :(得分:1)

嗯,我认为证明这个问题是不值得的,因为应该使用一个好的编码风格,这就是:初始化所有变量!一个例子:如果你“释放”一个指针,只需给它们一个像这个例子中的值:

string

这是一种安全和良好的风格。此外,如果您偶然再次使用let number = 123456 let array = String(number).characters.map{Int(String($0)) ?? 0} ,它将不会崩溃您的程序!在此示例中 - 如果在执行char *p=NULL; // yes, this is not needed but do it! later you may change your program an add code beneath this line... p=(char *)malloc(512); ... free(p); p=NULL; 后未将free(p)设置为NULL,则可以再次错误地使用指针,并且程序将尝试解决已释放的内存 - 这会破坏您的程序或(更糟糕)可能以奇怪的结果结束。 因此,不要浪费时间对指针指向p的情况提出疑问。只需为变量(指针)设置值! : - )

答案 2 :(得分:0)

这取决于编译器。您在旧版MSVC2008上执行的代码以发布模式显示(普通随机):

1955116784
1955116784

并且在调试模式下(在使用单位指针使用后呱呱叫):

-858993460
-858993460

因为该实现在调试模式下将未初始化的指针设置为0xcccccccc以检测它们的用法。

标准规定使用未初始化的指针会导致未定义的行为。这意味着来自标准的任何事情都可能发生。但是一个特定的实现可以随心所欲地做任何事情:

  • 你的碰巧将指针设置为0(但你不应该依赖它,除非它在实现文档中有记录)。
  • 调试模式下的MSVC在调试模式下将指针设置为0xcccccccc,但AFAIK没有记录它(*),所以我们仍然不能依赖它

(*)至少我找不到任何参考......