首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

具体谈一下变量初始化的重要性

2013-03-01 
具体谈谈变量初始化的重要性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就避免了这样的错误
[解决办法]
        此时数组占用的这块内存存储的数据是毫无用处的(属于之前使用所遗留的数据,你不清楚每个元素存储的值,自然对你也毫无意义),除开对数组元素进行赋初值(第一次赋值,即初始化),其他任何操作(读取、比较..)都是未定义,这是错误的开始。
[解决办法]
引用:
Hello,同志们,
    我从第一节课开始,就被告知变量初始化的重要性。
    但是有些问题没搞懂。
    比如, CHAR char[100];
    就这样扔着不初始化,直接使用,到底会有什么样的潜在危害?

    谢谢。

楼主应该先搞清楚什么是变量,变量的类型之后,再考虑这个问题
可以肯定的说,并不是所有类型的变量都需要初始化,所以,这个命题一开始就是伪命题
举例:
makefile里面的很多变量就不需要初始化,也无法初始化
[解决办法]
引用:
如果是赋值呢?比如strcpy,strcat,这种情况下,会有什么隐患吗?
为初始化前,可以作为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变量的。


[解决办法]
引用:
我再补充一下。
C/C++ code?12char buf[100];strcat(buf, "hello,world");
使用strcat这个函数 需要你自己保证第一个参数指向一个字符串 自己保重缓冲区有足够大小 做不到请责怪自己
[解决办法]
引用:
我再补充一下。
C/C++ code?12char buf[100];strcat(buf, "hello,world");
另外我觉得你用错函数了 strcpy 效果更好
[解决办法]
未初始化的变量除了用于赋值以外,其他行为都是没有意义,也很有可能是错误的。

当然你可以打印出char buf[100]中的数据,但是没有任何意义,这里面的值有可能是上一个栈帧中的废弃值。


[解决办法]
 char char[100] = {0};
[解决办法]
引用:
针对ASCIIZ字符串来说,只要别忘了在该填写字符串末尾'\0'的时候填写'\0',比如
C/C++ code?1strncpy(d,s,n);d[n]='\0';
可以不初始化比如memset(字符串首地址,0,字符串所占空间字节大小)。

\0和0,有没有区别?
[解决办法]
引用:
引用:针对ASCIIZ字符串来说,只要别忘了在该填写字符串末尾'\0'的时候填写'\0',比如
C/C++ code?1strncpy(d,s,n);d[n]='\0';
可以不初始化比如memset(字符串首地址,0,字符串所占空间字节大小)。
\0和0,有没有区别?
对c语言来说 '\0' 和 0 没区别
[解决办法]
引用:
引用:引用:针对ASCIIZ字符串来说,只要别忘了在该填写字符串末尾'\0'的时候填写'\0',比如
C/C++ code?1strncpy(d,s,n);d[n]='\0';
可以不初始化比如memset(字符串首地址,0,字符串所占空间字节大小)。
\0和0,有没有区别?对c语……

char ch[100]={0};
和memset(ch,0,sizeof(ch))
有无区别?
[解决办法]
char ch[100]={0}; 初始化只能在定义的时候做 
memset 只能在定义之后做

后果是一样 ch[100] 每一个元素都是 0 
[解决办法]
楼主问的是重要性,我只讲重要性,

在某些语言里,不初始化,你都编译不过,比如C#。

在某些语言中,就没有声明,第一次使用就是初始化,否则你都Run不了。。。

你说重要不?

热点排行