2014-03-05 102 views
0

我注意到,声明很多时候变量/数组的/ etc,人们给它一个空值或0为什么在声明时给变量赋一个空值?

例如,看看下面的代码片段:

int nNum = 0; 
char cBuffer[10] = { 0 }; 
int *nPointer = NULL; 

直到询问这个问题,我认为它将用于调试目的,因为当我用调试一个程序与Visual Studio我注意到,没有价值的变量有 未定义的数字作为它们的值,而他们有0 .. 0.

+2

初始化一个变量总是一个好习惯。检查指针是否为NULL允许您分配所需的数据,如果尚未分配它的话。 – Antonio

+1

对我来说,这就像问:为什么在声明它时给变量*任何*值? –

回答

1

有许多理由来初始化变量为0或NULL。首先,请记住,除非它在文件范围(在任何函数之外)或static关键字声明,否则变量将包含不确定的值;它可能是0,它可能是0xDEADBEEF,它可能是别的。

中的款项,专柜等,你要确保你从0开始,否则你将得到一个无效的结果:

int sum = 0; 
while (not_at_end_of_things_to_sum) 
    sum += next_thing_to_sum; 

int count = 0; 
while (there_is_another_thing_to_count) 
    count++; 

当然,你不已将作为声明的一部分初始化这些类型的变量;你只是想确保他们清零然后再使用它们,所以你可以写

int count; 
... 
count = 0; 
while (there_is_another_thing_to_count) 
    count++; 

它只是做它作为声明的一部分,您不必以后担心。

对于准备持有字符串数组,这是确保有一个0终止,如果你正在构建一个字符串,而无需使用strcpystrcatscanf或类似:

char buf[N] = { 0 }; // first element is *explicitly* initialized to 0, 
        // remaining elements are *implicitly* initialized to 0 

while (not_at_end_of_input && i < N - 1) 
    buf[i++] = next_char; 

你不做这种方式,但除此之外,你必须一定要手工添加的0终止:

buf[i] = 0; 

为指针,它可以很容易测试一个指针是Val是否或不是。 NULL指针是一个明确的无效指针值,很容易再次进行测试:

char *p = NULL; 
... 
if (!p) // or p == NULL) 
{ 
    // p has not yet been assigned or allocated 
    p = malloc(...); 
} 

否则,它实际上是不可能分辨指针值是有效的(指向具有malloc分配的对象或内存)或不。

+0

一个非常有帮助的解释,清除了一切,谢谢。 – NULL

0

未初始化的指针变量可能包含垃圾值。用NULL初始化一个指针的目的是,如果您不经意地使用它而没有分配正确的地址,那么最终不会修改随机存储器地址处的内容。

+0

这是**一**的原因。 –

+0

@KarolyHorvath请你详细说明一下吗? – Kunal

0

根据不同的语言,你可以使用NULL或只是int *nPointer;

这就是所谓的初始化变量,即你正在创建它。如果你希望你的程序保持一个不变的状态,这是非常有用的,因为知道“未初始化”的变量不会导致异常。

如果你inializing循环或函数内部varibale,和你想使用它的是循环/功能和循环/功能只执行外,当有连接到它的条件如:

if(nNum != 0){ 
    int *nPointer = NULL; 
    for(int i=0; i<10; i++){ 
     *nPointer++; 
    } 
} 

在这种情况下,如果您没有初始化您的变量,并且您尝试在线后使用它,那么您的程序可能会中断。但是,如果它已经初始化,你的安全,知道它存在,但仍然是NULL

SAFER CODE:

int *nPointer = NULL; //Or this will be a class member 
if(nNum != 0){ 
    for(int i=0; i<10; i++){ 
     *nPointer++; 
    } 
} 
相关问题