今天遇到一个bug,调试了半天发现是因为字符串未填满部分的值超出了函数参数范围造成的。以前看书上说未初始化的数组是垃圾数据,未填满的字符串会被自动初始化为0。今天发现仅当在定义数组的同时对数组进行初始化时是这样。在已经定义字符串后,利用函数对字符串进行赋值时,未填满打的部分并不是自动为零(在VS2015中)。且有两种情况。
先看下面一个程序,这是定义数组时给数组初始化:
int main(void)
{
char ch[10]="ss";
int i;
for(i=0;i<10;i++)
printf("%d",ch[i]);
return 0;
}
未填满部分字符数组皆为0。
下一个,这是利用gets_s给字符串赋值:
int main(void)
{
char ch[10];
int i;
gets_s(ch);
for(i=0;i<10;i++)
printf("%d",ch[i]);
return 0;
}
未填满部分皆为-2。
以下分别是利用scanf_s和getchar给ch赋值,未填满部分均为-52.
int main(void)
{
char ch[10];
int i;
for(i=0;i<5;i++)
scanf_s("%c",&ch[i]);
for(i=0;i<10;i++)
printf("%d",ch[i]);
return 0;
}
int main(void)
{
char ch[10];
int i;
for(i=0;i<5;i++)
ch[i]=getchar();
for(i=0;i<10;i++)
printf("%d",ch[i]);
return 0;
}