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

时间:2022-09-09 14:45:50
Hello,同志们,
    我从第一节课开始,就被告知变量初始化的重要性。
    但是有些问题没搞懂。
    比如, CHAR char[100];
    就这样扔着不初始化,直接使用,到底会有什么样的潜在危害?

    谢谢。

30 个解决方案

#1


你无法判断里面的内容是否有意义。

#2


char GetChar(BOOL bDef)
{
int ch;//没初始化

if (!bDef)
{
ch = 'y';//满足某个条件才赋值
}
return ch;//不能确定返回是否是正确的值。
}

#3





引用 1 楼 snake_xiongyang 的回复:
你无法判断里面的内容是否有意义。

比如在那种情况下?麻烦给举例,谢谢。

#4


引用 3 楼 zero_226 的回复:
引用 1 楼 snake_xiongyang 的回复:
你无法判断里面的内容是否有意义。
比如在那种情况下?麻烦给举例,谢谢。
比如定义一个指针,char *p;
p指向哪块内存呢?(此时p不等于NULL)如果你下边有这样的逻辑
if(NULL != p)
{
    //对p指向的内容做一些操作
}
就会产生错误,如果你初始化p为NULL就避免了这样的错误

#5


        此时数组占用的这块内存存储的数据是毫无用处的(属于之前使用所遗留的数据,你不清楚每个元素存储的值,自然对你也毫无意义),除开对数组元素进行赋初值(第一次赋值,即初始化),其他任何操作(读取、比较..)都是未定义,这是错误的开始。

#6


如果是赋值呢?比如strcpy,strcat,这种情况下,会有什么隐患吗?

#7


引用 楼主 zero_226 的回复:
Hello,同志们,
    我从第一节课开始,就被告知变量初始化的重要性。
    但是有些问题没搞懂。
    比如, CHAR char[100];
    就这样扔着不初始化,直接使用,到底会有什么样的潜在危害?

    谢谢。

楼主应该先搞清楚什么是变量,变量的类型之后,再考虑这个问题
可以肯定的说,并不是所有类型的变量都需要初始化,所以,这个命题一开始就是伪命题
举例:
makefile里面的很多变量就不需要初始化,也无法初始化

#8


嗯,谢谢。
今天我们就讨论我举的例子。字符串数组,需不需要初始化。

#9


引用 6 楼 zero_226 的回复:
如果是赋值呢?比如strcpy,strcat,这种情况下,会有什么隐患吗?
为初始化前,可以作为strcpy,strcat都是存在隐患的。
例如,未初始化数组arr可能存在的遗留数据是“Hello World”(注:这只是个假设),但使用者(你)并不清楚遗留内容,想当然arr是‘空的’,因为你没有初始化数组;然后你如果在strcat(arr," csdn")。此时你臆测的结果arr保存的内容为" csdn",但其实不然,arr保存内容为“Hello World csdn”。
然而使用者对此不知情,后续使用到arr将面临一系列程序异常。所用初始化是非常有必要的做法。

#10


正确初始化,肯定是正确的。
没初始化的话,可能是正确的,也可能是错误的。

为啥不直接做肯定正确的事情?

#11


我当然想做正确的事。
只是在代码评审的时候,看到了没有初始化的变量,我要求初始化,人反问,这种情况不初始化也没有什么危害,为什么一定要初始化。
我不能答所以然,才到这来一探究竟的。

还望指教。

#12


引用 11 楼 zero_226 的回复:
我当然想做正确的事。
只是在代码评审的时候,看到了没有初始化的变量,我要求初始化,人反问,这种情况不初始化也没有什么危害,为什么一定要初始化。
我不能答所以然,才到这来一探究竟的。

还望指教。

既然是代码审查的讨论,分歧不下,那就用个代码审查工具看看是否报错嘛
比如:splint
一般健壮性考虑,当然初始化的数据比没有初始化的更好

#13


针对ASCIIZ字符串来说,只要别忘了在该填写字符串末尾'\0'的时候填写'\0',比如
strncpy(d,s,n);d[n]='\0';

可以不初始化比如memset(字符串首地址,0,字符串所占空间字节大小)。

#14


引用 11 楼 zero_226 的回复:
我当然想做正确的事。
只是在代码评审的时候,看到了没有初始化的变量,我要求初始化,人反问,这种情况不初始化也没有什么危害,为什么一定要初始化。
我不能答所以然,才到这来一探究竟的。

还望指教。

没危害 != 正确的

#15


有必要就初始化 没必要就算了 

#16


全部初始化 直接用Java就是了 保证全都初始化

#17


引用 15 楼 lin5161678 的回复:
有必要就初始化 没必要就算了

++

#18


引用 8 楼 zero_226 的回复:
嗯,谢谢。
今天我们就讨论我举的例子。字符串数组,需不需要初始化。

讨论楼主的例子

char buf[100];

是毫无意义的。
这个取决于你将来的代码是如何使用buf变量的。

#19


我再补充一下。

char buf[100];
strcat(buf, "hello,world");

#20


引用 19 楼 zero_226 的回复:
我再补充一下。
C/C++ code?12char buf[100];strcat(buf, "hello,world");
使用strcat这个函数 需要你自己保证第一个参数指向一个字符串 自己保重缓冲区有足够大小 做不到请责怪自己

#21


引用 19 楼 zero_226 的回复:
我再补充一下。
C/C++ code?12char buf[100];strcat(buf, "hello,world");
另外我觉得你用错函数了 strcpy 效果更好

#22


哦,谢谢。

我只是举个例子,就是说先定义了个未初始化的字符串数组,然后这个数组会在别处进行写的东西,这样会导致什么问题?

#23


未初始化的变量除了用于赋值以外,其他行为都是没有意义,也很有可能是错误的。

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

#24


 char char[100] = {0};

#25


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

\0和0,有没有区别?

#26


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

#27


引用 26 楼 lin5161678 的回复:
引用 25 楼 wangyaninglm 的回复:引用 13 楼 zhao4zhong1 的回复:针对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))
有无区别?

#28


char ch[100]={0}; 初始化只能在定义的时候做 
memset 只能在定义之后做

后果是一样 ch[100] 每一个元素都是 0 

#29


楼主问的是重要性,我只讲重要性,

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

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

你说重要不?

#30


引用 19 楼 zero_226 的回复:
我再补充一下。
C/C++ code?12char buf[100];strcat(buf, "hello,world");

应为
char buf[100];
buf[0]=0;strcat(buf,"hello,world");
//或
strcpy(buf,"hello,world");
//或
if (str2!=NULL) {strncpy(buf,str2,99);buf[99]=0;}//不知道str2有多长时

#1


你无法判断里面的内容是否有意义。

#2


char GetChar(BOOL bDef)
{
int ch;//没初始化

if (!bDef)
{
ch = 'y';//满足某个条件才赋值
}
return ch;//不能确定返回是否是正确的值。
}

#3





引用 1 楼 snake_xiongyang 的回复:
你无法判断里面的内容是否有意义。

比如在那种情况下?麻烦给举例,谢谢。

#4


引用 3 楼 zero_226 的回复:
引用 1 楼 snake_xiongyang 的回复:
你无法判断里面的内容是否有意义。
比如在那种情况下?麻烦给举例,谢谢。
比如定义一个指针,char *p;
p指向哪块内存呢?(此时p不等于NULL)如果你下边有这样的逻辑
if(NULL != p)
{
    //对p指向的内容做一些操作
}
就会产生错误,如果你初始化p为NULL就避免了这样的错误

#5


        此时数组占用的这块内存存储的数据是毫无用处的(属于之前使用所遗留的数据,你不清楚每个元素存储的值,自然对你也毫无意义),除开对数组元素进行赋初值(第一次赋值,即初始化),其他任何操作(读取、比较..)都是未定义,这是错误的开始。

#6


如果是赋值呢?比如strcpy,strcat,这种情况下,会有什么隐患吗?

#7


引用 楼主 zero_226 的回复:
Hello,同志们,
    我从第一节课开始,就被告知变量初始化的重要性。
    但是有些问题没搞懂。
    比如, CHAR char[100];
    就这样扔着不初始化,直接使用,到底会有什么样的潜在危害?

    谢谢。

楼主应该先搞清楚什么是变量,变量的类型之后,再考虑这个问题
可以肯定的说,并不是所有类型的变量都需要初始化,所以,这个命题一开始就是伪命题
举例:
makefile里面的很多变量就不需要初始化,也无法初始化

#8


嗯,谢谢。
今天我们就讨论我举的例子。字符串数组,需不需要初始化。

#9


引用 6 楼 zero_226 的回复:
如果是赋值呢?比如strcpy,strcat,这种情况下,会有什么隐患吗?
为初始化前,可以作为strcpy,strcat都是存在隐患的。
例如,未初始化数组arr可能存在的遗留数据是“Hello World”(注:这只是个假设),但使用者(你)并不清楚遗留内容,想当然arr是‘空的’,因为你没有初始化数组;然后你如果在strcat(arr," csdn")。此时你臆测的结果arr保存的内容为" csdn",但其实不然,arr保存内容为“Hello World csdn”。
然而使用者对此不知情,后续使用到arr将面临一系列程序异常。所用初始化是非常有必要的做法。

#10


正确初始化,肯定是正确的。
没初始化的话,可能是正确的,也可能是错误的。

为啥不直接做肯定正确的事情?

#11


我当然想做正确的事。
只是在代码评审的时候,看到了没有初始化的变量,我要求初始化,人反问,这种情况不初始化也没有什么危害,为什么一定要初始化。
我不能答所以然,才到这来一探究竟的。

还望指教。

#12


引用 11 楼 zero_226 的回复:
我当然想做正确的事。
只是在代码评审的时候,看到了没有初始化的变量,我要求初始化,人反问,这种情况不初始化也没有什么危害,为什么一定要初始化。
我不能答所以然,才到这来一探究竟的。

还望指教。

既然是代码审查的讨论,分歧不下,那就用个代码审查工具看看是否报错嘛
比如:splint
一般健壮性考虑,当然初始化的数据比没有初始化的更好

#13


针对ASCIIZ字符串来说,只要别忘了在该填写字符串末尾'\0'的时候填写'\0',比如
strncpy(d,s,n);d[n]='\0';

可以不初始化比如memset(字符串首地址,0,字符串所占空间字节大小)。

#14


引用 11 楼 zero_226 的回复:
我当然想做正确的事。
只是在代码评审的时候,看到了没有初始化的变量,我要求初始化,人反问,这种情况不初始化也没有什么危害,为什么一定要初始化。
我不能答所以然,才到这来一探究竟的。

还望指教。

没危害 != 正确的

#15


有必要就初始化 没必要就算了 

#16


全部初始化 直接用Java就是了 保证全都初始化

#17


引用 15 楼 lin5161678 的回复:
有必要就初始化 没必要就算了

++

#18


引用 8 楼 zero_226 的回复:
嗯,谢谢。
今天我们就讨论我举的例子。字符串数组,需不需要初始化。

讨论楼主的例子

char buf[100];

是毫无意义的。
这个取决于你将来的代码是如何使用buf变量的。

#19


我再补充一下。

char buf[100];
strcat(buf, "hello,world");

#20


引用 19 楼 zero_226 的回复:
我再补充一下。
C/C++ code?12char buf[100];strcat(buf, "hello,world");
使用strcat这个函数 需要你自己保证第一个参数指向一个字符串 自己保重缓冲区有足够大小 做不到请责怪自己

#21


引用 19 楼 zero_226 的回复:
我再补充一下。
C/C++ code?12char buf[100];strcat(buf, "hello,world");
另外我觉得你用错函数了 strcpy 效果更好

#22


哦,谢谢。

我只是举个例子,就是说先定义了个未初始化的字符串数组,然后这个数组会在别处进行写的东西,这样会导致什么问题?

#23


未初始化的变量除了用于赋值以外,其他行为都是没有意义,也很有可能是错误的。

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

#24


 char char[100] = {0};

#25


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

\0和0,有没有区别?

#26


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

#27


引用 26 楼 lin5161678 的回复:
引用 25 楼 wangyaninglm 的回复:引用 13 楼 zhao4zhong1 的回复:针对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))
有无区别?

#28


char ch[100]={0}; 初始化只能在定义的时候做 
memset 只能在定义之后做

后果是一样 ch[100] 每一个元素都是 0 

#29


楼主问的是重要性,我只讲重要性,

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

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

你说重要不?

#30


引用 19 楼 zero_226 的回复:
我再补充一下。
C/C++ code?12char buf[100];strcat(buf, "hello,world");

应为
char buf[100];
buf[0]=0;strcat(buf,"hello,world");
//或
strcpy(buf,"hello,world");
//或
if (str2!=NULL) {strncpy(buf,str2,99);buf[99]=0;}//不知道str2有多长时