为什么在声明变量时给变量赋一个空值?

时间:2014-03-05 14:39:37

标签: c

我注意到很多次声明变量/数组/等时,人们给它一个空值或0。

例如,请查看以下代码段:

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

等等。

直到问这个问题,我认为这是为了调试目的,因为当我 用Visual Studio调试程序我注意到没有值的变量了 未定义数字作为它们的值,而0表示它们有... 0。

3 个答案:

答案 0 :(得分:1)

将变量初始化为0或NULL有很多原因。

首先,请记住,除非在文件范围(任何函数之外)或static关键字声明,否则变量将包含 indeterminate 值;它可能是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++;

只是通过将其作为声明的一部分,您不必在以后担心。

对于用于保存字符串的数组,如果您在不使用strcpystrcatscanf或类似字符串的情况下构建字符串,则应确保存在0终止符:

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;

对于指针,可以很容易地测试指针是否有效。 NULL指针是一个定义良好的无效指针值,很容易测试:

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

否则,实际上无法判断指针值是否有效(指向分配有malloc的对象或内存)。

答案 1 :(得分:0)

未初始化的指针变量可能包含垃圾值。使用NULL初始化指针的目的是,如果您在不指定正确地址的情况下无意中使用它,则不会最终修改随机存储器地址中的内容。

答案 2 :(得分:0)

根据语言的不同,您可以使用NULLint *nPointer;

它被称为初始化变量,即你正在创建它。如果您希望程序保持不变状态,并且知道“未初始化”变量不会导致异常,这非常有用。

如果你正在循环或函数中使用一个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++;
     }
 }