相关疑难解决方法(0)

什么是nullptr?

我们现在拥有许多新功能的C++ 11.一个有趣且令人困惑的(至少对我来说)是新的nullptr.

嗯,不再需要令人讨厌的宏了NULL.

int* x = nullptr;
myclass* obj = nullptr;
Run Code Online (Sandbox Code Playgroud)

尽管如此,我还没有得到如何nullptr运作.例如,维基百科的文章说:

C++ 11通过引入一个new 关键字作为一个区分空指针常量来解决这个问题:nullptr.它的类型为nullptr_t,它是可隐式转换的,可与任何指针类型或指向成员类型的类型相媲美.除了bool之外,它不可隐式转换或与整数类型相比.

它是一个关键字和一个类型的实例?

另外,你有另一个例子(在维基百科旁边)哪里nullptr优于好老0

c++ pointers nullptr c++11

546
推荐指数
8
解决办法
31万
查看次数

我可以使用if(指针)而不是if(指针!= NULL)吗?

检查指针是不是NULL通过简单写入if(pointer)或我必须使用它是否安全if(pointer != NULL)

c++ null pointers if-statement null-pointer

164
推荐指数
6
解决办法
8万
查看次数

重新定义NULL

我正在为地址0x0000有效且包含端口I/O的系统编写C代码.因此,访问NULL指针的任何可能的错误都将保持不被检测到,同时会导致危险的行为.

出于这个原因,我希望将NULL重新定义为另一个地址,例如一个无效的地址.如果我不小心访问了这样的地址,我将得到一个硬件中断,我可以处理错误.我碰巧有权访问此编译器的stddef.h,因此我实际上可以更改标准头并重新定义NULL.

我的问题是:这会与C标准发生冲突吗?据我所知,从标准中的7.17开始,宏是实现定义的.标准中的其他地方是否有任何内容表明NULL 必须为0?

另一个问题是,无论数据类型如何,大量编译器都会通过将所有内容设置为零来执行静态初始化.尽管标准规定编译器应将整数设置为零并将指针设置为NULL.如果我将为我的编译器重新定义NULL,那么我知道这样的静态初始化将失败.我是否可以将其视为不正确的编译器行为,即使我手动大胆地更改了编译器头?因为我确实知道这个特定的编译器在进行静态初始化时不访问NULL宏.

c null

118
推荐指数
4
解决办法
4558
查看次数

以下哪个会创建空指针?

标准说,取消引用空指针会导致未定义的行为.但是什么是"空指针"?在下面的代码中,我们称之为"空指针":

struct X
{
  static X* get() { return reinterpret_cast<X*>(1); }
  void f() { }
};

int main()
{
  X* x = 0;
  (*x).f(); // the null pointer?  (1)

  x = X::get();
  (*x).f(); // the null pointer?  (2)

  x = reinterpret_cast<X*>( X::get() - X::get() );
  (*x).f(); // the null pointer?  (3)

  (*(X*)0).f(); // I think that this the only null pointer here (4)
}
Run Code Online (Sandbox Code Playgroud)

我的想法是,只有在最后一种情况下才会取消引用空指针.我对吗?根据C++标准,编译时空指针和运行时之间是否存在差异?

c++ null-pointer dereference

14
推荐指数
3
解决办法
9907
查看次数

C++98 正确检查空指针

C++11引入了nullptr我没有的关键字。

我想有NULL来自 C的宏,我从这里这里的一些东西中读到了在 C++ 中使用的宏,但我仍然不确定在这个旧的 C++ 标准中检查空指针的正确方法是什么。

我基本上希望能够使用 Boost Test 为我的测试用例编写此代码:

aWrapperDataStructure x;
BOOST_CHECK_NE(x.get_ptr(), static_cast<decltype(x.get_ptr())>(nullptr));
Run Code Online (Sandbox Code Playgroud)

但也许,正如 Tutorials Point 建议的那样,考虑到限制,这样的事情更合适:

BOOST_CHECK(x.get_ptr()); //true when not NULL
Run Code Online (Sandbox Code Playgroud)

不过,关于这方面的一些事情让我感到厌烦,所以我想知道这里的最佳做法是什么。如果它在网上的某个地方,或者在 SO 上,它已经被埋藏很久了,我找不到它。谢谢!

null-pointer c++98

5
推荐指数
1
解决办法
1044
查看次数

if(!ptr)VS if(ptr == NULL)在C中

有时我看到程序员使用:

void *ptr = <something>;
if (ptr == NULL)
    <do something>;
Run Code Online (Sandbox Code Playgroud)

代替:

void *ptr = <something>;
if (!ptr)
    <do something>;
Run Code Online (Sandbox Code Playgroud)

有什么可以出错if (!ptr),或者只是一种编码风格偏好?

c pointers

2
推荐指数
1
解决办法
1178
查看次数

标签 统计

c++ ×3

null-pointer ×3

pointers ×3

c ×2

null ×2

c++11 ×1

c++98 ×1

dereference ×1

if-statement ×1

nullptr ×1