我注意到,声明很多时候变量/数组的/ etc,人们给它一个空值或0为什么在声明时给变量赋一个空值?
例如,看看下面的代码片段:
int nNum = 0;
char cBuffer[10] = { 0 };
int *nPointer = NULL;
等
直到询问这个问题,我认为它将用于调试目的,因为当我用调试一个程序与Visual Studio我注意到,没有价值的变量有 未定义的数字作为它们的值,而他们有0 .. 0.
我注意到,声明很多时候变量/数组的/ etc,人们给它一个空值或0为什么在声明时给变量赋一个空值?
例如,看看下面的代码片段:
int nNum = 0;
char cBuffer[10] = { 0 };
int *nPointer = NULL;
等
直到询问这个问题,我认为它将用于调试目的,因为当我用调试一个程序与Visual Studio我注意到,没有价值的变量有 未定义的数字作为它们的值,而他们有0 .. 0.
有许多理由来初始化变量为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终止,如果你正在构建一个字符串,而无需使用strcpy
或strcat
或scanf
或类似:
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
分配的对象或内存)或不。
一个非常有帮助的解释,清除了一切,谢谢。 – NULL
未初始化的指针变量可能包含垃圾值。用NULL
初始化一个指针的目的是,如果您不经意地使用它而没有分配正确的地址,那么最终不会修改随机存储器地址处的内容。
这是**一**的原因。 –
@KarolyHorvath请你详细说明一下吗? – Kunal
根据不同的语言,你可以使用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++;
}
}
初始化一个变量总是一个好习惯。检查指针是否为NULL允许您分配所需的数据,如果尚未分配它的话。 – Antonio
对我来说,这就像问:为什么在声明它时给变量*任何*值? –