【问题标题】:null pointer doesn't address to 0x0 location in cpp空指针不指向 cpp 中的 0x0 位置
【发布时间】:2017-09-26 06:00:41
【问题描述】:

我想通过如下 if 条件来评估指针是否为空:

Model * model; 
if(model == nullptr){
    //do something...
}

但这不起作用,奇怪的是模型指针不是指向0x0位置,而是指向0xcdcdcdcdcdcdcdcd内存位置然后model==nullptr不起作用,我也做了if(model)if(model== NULL)这些是也不行!

对这个问题有什么想法吗?

【问题讨论】:

  • 请停止向不相关的标签发送垃圾邮件。 c 中没有nullptr

标签: c++ pointers null


【解决方案1】:

未初始化的指针不必指向NULL。它可以指向任何地方。

【讨论】:

  • @M.M 确实如此,但为此您需要在某个时候将指针设置为nullptr。在那之前它是未初始化的,其内容由实现决定
【解决方案2】:

此代码调用未定义行为,因为您的指针未初始化

你需要初始化你指向nullptr的指针,然后检查它,否则它的值就是垃圾(它可以是任何东西)。

PS:空指针必须与表达式0x0 比较。

【讨论】:

    【解决方案3】:

    指针Model * model; 将根据分配指针的内存位置获取任何随机垃圾值。 C/C++ 标准不要求将已声明但未初始化的指针自动初始化为 NULL(或任何默认值)。

    现在,我不太清楚为什么在声明后立即将指针与 NULL 进行比较,但是在指针被分配一个函数或某个表达式返回的值之后,这种比较才有意义:

    Model * model = some_func(/* .. */);  // This would be 
    if (model == NULL) {                  // a valid usage
    }
    

    【讨论】:

      【解决方案4】:

      如果您使用 Visual Studio,您使用的是哪个 IDE,它使用 NULL 像这样

      但这里是解决方案

      Model * model=NULL;
      if(model == NULL){
          //do something...
      }
      

      【讨论】:

      • 尽管正确支持最新的 C++ 标准版本相当缓慢,但 MSVC 支持 nullptr 已经有一段时间了。自从他们开始支持 C++11 以来。
      • 不是IDE,而是编译器是否支持C++11
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 2016-05-15
      • 2012-07-02
      相关资源
      最近更新 更多