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