我注意到很多次声明变量/数组/等时,人们给它一个空值或0。
例如,请查看以下代码段:
int nNum = 0;
char cBuffer[10] = { 0 };
int *nPointer = NULL;
等等。
直到问这个问题,我认为这是为了调试目的,因为当我 用Visual Studio调试程序我注意到没有值的变量了 未定义数字作为它们的值,而0表示它们有... 0。
答案 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++;
只是通过将其作为声明的一部分,您不必在以后担心。
对于用于保存字符串的数组,如果您在不使用strcpy
或strcat
或scanf
或类似字符串的情况下构建字符串,则应确保存在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)
根据语言的不同,您可以使用NULL
或int *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++;
}
}