具体谈谈变量初始化的重要性Hello,同志们,我从第一节课开始,就被告知变量初始化的重要性。但是有些问题没搞
具体谈谈变量初始化的重要性
Hello,同志们,
我从第一节课开始,就被告知变量初始化的重要性。
但是有些问题没搞懂。
比如, CHAR char[100];
就这样扔着不初始化,直接使用,到底会有什么样的潜在危害?
谢谢。
[解决办法]
你无法判断里面的内容是否有意义。
[解决办法]
char GetChar(BOOL bDef)
{
int ch;//没初始化
if (!bDef)
{
ch = 'y';//满足某个条件才赋值
}
return ch;//不能确定返回是否是正确的值。
}
[解决办法]比如定义一个指针,char *p;
p指向哪块内存呢?(此时p不等于NULL)如果你下边有这样的逻辑
if(NULL != p)
{
//对p指向的内容做一些操作
}
就会产生错误,如果你初始化p为NULL就避免了这样的错误
[解决办法] 此时数组占用的这块内存存储的数据是毫无用处的(属于之前使用所遗留的数据,你不清楚每个元素存储的值,自然对你也毫无意义),除开对数组元素进行赋初值(第一次赋值,即初始化),其他任何操作(读取、比较..)都是未定义,这是错误的开始。
[解决办法]楼主应该先搞清楚什么是变量,变量的类型之后,再考虑这个问题
可以肯定的说,并不是所有类型的变量都需要初始化,所以,这个命题一开始就是伪命题
举例:
makefile里面的很多变量就不需要初始化,也无法初始化
[解决办法]为初始化前,可以作为strcpy,strcat都是存在隐患的。
例如,未初始化数组arr可能存在的遗留数据是“Hello World”(注:这只是个假设),但使用者(你)并不清楚遗留内容,想当然arr是‘空的’,因为你没有初始化数组;然后你如果在strcat(arr," csdn")。此时你臆测的结果arr保存的内容为" csdn",但其实不然,arr保存内容为“Hello World csdn”。
然而使用者对此不知情,后续使用到arr将面临一系列程序异常。所用初始化是非常有必要的做法。
[解决办法]正确初始化,肯定是正确的。
没初始化的话,可能是正确的,也可能是错误的。
为啥不直接做肯定正确的事情?
[解决办法]既然是代码审查的讨论,分歧不下,那就用个代码审查工具看看是否报错嘛
比如:splint
一般健壮性考虑,当然初始化的数据比没有初始化的更好
[解决办法]针对ASCIIZ字符串来说,只要别忘了在该填写字符串末尾'\0'的时候填写'\0',比如
strncpy(d,s,n);d[n]='\0';
可以不初始化比如memset(字符串首地址,0,字符串所占空间字节大小)。
[解决办法]没危害 != 正确的
[解决办法]有必要就初始化 没必要就算了
[解决办法]全部初始化 直接用Java就是了 保证全都初始化
[解决办法]
++
[解决办法]讨论楼主的例子
char buf[100];
是毫无意义的。
这个取决于你将来的代码是如何使用buf变量的。
[解决办法]使用strcat这个函数 需要你自己保证第一个参数指向一个字符串 自己保重缓冲区有足够大小 做不到请责怪自己
[解决办法]另外我觉得你用错函数了 strcpy 效果更好
[解决办法]未初始化的变量除了用于赋值以外,其他行为都是没有意义,也很有可能是错误的。
当然你可以打印出char buf[100]中的数据,但是没有任何意义,这里面的值有可能是上一个栈帧中的废弃值。
[解决办法] char char[100] = {0};
[解决办法]\0和0,有没有区别?
[解决办法]对c语言来说 '\0' 和 0 没区别
[解决办法]char ch[100]={0};
和memset(ch,0,sizeof(ch))
有无区别?
[解决办法]char ch[100]={0}; 初始化只能在定义的时候做
memset 只能在定义之后做
后果是一样 ch[100] 每一个元素都是 0
[解决办法]楼主问的是重要性,我只讲重要性,
在某些语言里,不初始化,你都编译不过,比如C#。
在某些语言中,就没有声明,第一次使用就是初始化,否则你都Run不了。。。
你说重要不?