将指针设置为零等效于将其设置为NULL?

时间:2012-07-02 07:34:59

标签: c++ c

我在网上搜索但找不到可靠的答案。 什么会

someclass* ptr = 1;
char* charptr = 2;

或将它们分配给任何其他整数意味着什么?

如果我在使用之前没有初始化指针(对于本机数据指针和类指针)会发生什么?

2 个答案:

答案 0 :(得分:3)

设置指向0的指针等同于将其设置为NULL。但是,这仅适用于常量表达式 0,即编译时零值。尝试设置指向运行时零值的指针不能保证产生空指针

int *pi = 0; // Initializes a null pointer
char *pc = 2 - 2; // Initializes a null pointer
short *ps = sizeof *pc - 1; // Initializes a null pointer

int x = 0;
double *pd = (double *) x; 
// Implementation-defined, not guaranteed to produce a null pointer

您可以更详细地探讨此事C FAQ

回答问题的第二部分:

将任何其他整数(除了文字/常量0)分配给指针是违法的。您的初始化(或分配)都不会编译。它在C和C ++中都是非法的,尽管C编译器在历史上更多地允许这方面,但是响应警告而不是拒绝编译代码。

另外,在C ++语言中,如何处理类类型的指针没有区别。类类型的指针仍然被认为是标量类型,并且在这方面的行为与指向基本类型的指针的行为相同。

答案 1 :(得分:1)

是的,在C ++中NULL定义为0.设置指向其他小整数值的指针意味着它指向计算机内存的一个 - 可能是非法的 - 部分(但不会被视为NULL)指针)。

如果不初始化全局指针,它将在程序启动之前为您设置为零(NULL)。如果你没有初始化在栈上声明的指针变量(即在函数或方法中),它们将会有垃圾。同样,任何动态分配的指针的内容或作为数据成员的对象中包含的任何内容也将没有预定义的值。有些编译器具有扩展,允许动态分配的内存请求最初归零,如C的calloc()函数对原始内存的影响。