我试图通过两种方式创建一个新指针,它们的含义是否相同?
int* ptn;
int* ptn(nullptr);
答案 0 :(得分:10)
我试图通过两种方式创建一个新指针,它们的含义是否相同?
不,他们没有 - 或者至少,并非总是如此。
如果这些变量是在块作用域声明的,那么第一个将只给你一个未初始化的指针,而第二个将把指针初始化为空指针值。所以在第一种情况下:
int main()
{
int* ptn; // This gives you an uninitialized pointer...
if (ptn == nullptr) // ...so this is UNDEFINED BEHAVIOR!
{
// ...
}
}
如果您在将其初始化为某个值之前使用ptn
的值,则会遇到未定义的行为。
另一方面,如果它们在命名空间范围内,则两个声明将是等效的,因为ptr
将具有静态存储持续时间,并且无论如何都将被初始化为零:< / p>
int* ptn; // This pointer has static storage duration, will be zero-initialized...
int main()
{
if (ptn == nullptr) // ...so no undefined behavior here!
{
// This will be entered...
}
}
根据C ++ 11标准的第8.5 / 10段:
[注意:在任何其他初始化之前,静态存储持续时间的每个对象在程序启动时都是零初始化的 发生了。在某些情况下,稍后会进行额外的初始化。 - 后注]
答案 1 :(得分:1)
他们不一样;第一行可能不会将指针初始化为任何值,并且将是垃圾,尽管它通常是调试模式中的预定义垃圾,类似于0xcdcdcdcd
,因此您可以识别尝试访问未初始化指针的位置;对于堆栈上的指针与堆不同。第二行将初始化为空指针的新c ++版本(以前只是'0');和第二个一样,或者你有int * ptn = nullptr
,我发现它更常见。
答案 2 :(得分:0)
不,总是使用第二种形式!
第一个是未初始化的指针,它可以指向内存中的某个随机位置,访问它可能会导致其他疯狂行为中的访问冲突。
第二个将指针初始化为null。
答案 3 :(得分:0)
int * ptn;是一个指向任何东西或指向垃圾的指针。 int * ptn(nullptr);正在编译时初始化为空值。