2016-01-12 87 views
3

以下哪种方法是初始化变量的更正确方法?初始化变量和指针与NULL还是0有区别吗?

int x = 0; 
int x = NULL; 

指针怎么样?我被告知有关NULL的不协调的事情,比如:“NULL最适合初始化指针”或“不要使用NULL而是0初始化变量”等等......现在,我在互联网上看到NULL是平等的为0,我测试了自己。那么有什么意义呢?为什么有些人说使用NULL不是一个好选择?有什么我失踪了吗?

+1

'NULL'不等于'0'。 –

+0

此问题与[此其他问题]相关(http://stackoverflow.com/questions/9894013/is-null-always-zero-in-c) – Magix

+0

http://stackoverflow.com/questions/8288482/is -null-in-c-required-defined-to-zero – bruceg

回答

5

NULL是一个指针常量。你用它来初始化一个指向一个值的指针,该值指向任何东西。

在大多数C实现,它被定义为:

#define NULL ((void *)0) 

但有没有这样的保证。

+0

也许这就是为什么很多人告诉我使用NULL不是一个好主意?这可以解释我的神秘感 –

+1

@ClaudioCortese正确。在实践中,它们通常是相同的,但是如果您依赖于这种行为,然后将代码移到不存在的平台上,则会遇到各种问题。 – dbush

+0

Mhh,好的,所以它更多的是与代码的可移植性有关的东西,对吧? –

2

NULL是一个空指针常量。你应该使用它来初始化指针类型。

C11,章§7.19,stddef.h

NULL
,其扩展到一个实现定义空指针常量。

和在C 空指针恒定,章§6.3.2.3

与值0,或这样的转换为类型 void *表达的整数常量表达式,被称为空指针常量。[...]

所以,类型是指针的类型。

对于其他非指针变量,你应该使用0

+0

背后有真正的原因还是只是个人偏好? –

+0

@ClaudioCortese哪一个是个人喜好?类型很重要。也许大多数情况下,实现是_equivalent_,但它不是_same_。希望很清楚。 :) –

+0

我的意思是,如果NULL == 0,为什么可以用NULL初始化指针,为什么它不好用NULL初始化变量? –

-1

理论上NULL可以是指向不同于0的地址的指针。但实际上,这种定义会使大部分软件崩溃。在99.99%的情况下为0(或(void *)0)。

-1

有/部分架构部署NULL为而非零:Prime 50,Honeywell-Bull,CDC Cyber​​ 180系列等。在这些情况下,NULL绝对不能与零互换。

有关受影响机器的详细信息,请参见this answer

+1

我们是在谈论空指针*常量*还是空指针*值*?就C而言,空指针常量是* always * zero-valued。 –

+0

@JohnBode:是的,区分'NULL'(宏),_null pointer_和_null指针constant_总是个好主意。 – Olaf

+0

重点:wallyk的回答是误导性的; NULL通常被定义为那些空指针不为0的巴洛克式旧机器上的0 * even * *的一些版本。参见C FAQ列表,问题5.5。 –

1

不要使用NULL来初始化非指针类型,因为它可能会可能根据实现扩展到像(void *) 0之类的东西。使用普通的0(或宏或01​​限定变量,计算结果为普通0)为整型。

3

以下哪种方法是更正确的初始化变量的方法?

// int x = NULL; `NULL` implies pointer 
int x = 0;  // 0 implies integer value and x is an integer. 

怎么样的指针?

void *p = NULL; // `NULL` implies pointer and p is a pointer. 
//void *p = 0; // 0 implies integer value 

即NULL等于0

它是在值相等,但也许不是在比特模式。请参阅下面的+0.0, -0.0示例。


如果NULL等于0,总是那么就不会有需要它C.

NULL一个空指针辅音 - 它常常,但并不总是有零点模式。一个具有NULL值的指针总是与0的值相同:相同的值,不同的位模式。

请记住==比较值,而不是位模式。

void *a = NULL; 
if (a == NULL) Always_True(); 
if (a == 0) Always_True(); 

的例子,可能会有帮助。 +0.0-0.0具有相同的值,相同的类型,但不同的位模式。指针可能会出现类似的情况。

int main(void) { 
    double pz = +0.0; 
    double nz = -0.0; 
    printf("=:%d bits:%d\n", pz == nz, memcmp(&pz, &nz, sizeof pz) == 0); // =:1 bits:0 
    return 0; 
} 
1

当你初始化(或比较)一个指针时,肯定使用NULL;这是很好的风格。

绝对不要在使用整数时使用NULL;它很糟糕的风格(它可能无法正常工作)。

不要听任何人暗示你不应该使用带指针的NULL;他们可能会感到困惑。

有关更多信息,请参阅C常见问题列表http://c-faq.com/null/index.html

相关问题