马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我写出了一个关于输入字符串奇怪的BUG,好消息是这个BUG在这个程序里居然能读取字符串,坏消息是离开这段程序或者程序稍微修改一下就报错了
爱了爱了,这就是程序员们的“为什么这样都可以运行”问题吗
首先我知道正常输入字符串应该这么写的//方法一最正常的申请数组空间然后输入
char YN[1];
scanf("%s",YN);
//方法二给指针申请空间然后输入
char *YN=(char *)malloc(sizeof(char)*1);
scanf("%s",YN);
//然后这种写法是不行一定会报错的
char *YN;
scanf("%s",YN);
但是这种错误的写法却在无意中成功了,而且仅仅只有在这个自定义的函数中可以,怎么试都不成功
已经注释好位置了void changemessage(struct LIST *orglist)
{
char name[30];
int select;
printf("\n\n\n这里是修改功能,请输入你想查找的联系人:");
scanf("%s",name);
struct LIST *compare;
compare=orglist;
while(compare!=NULL&&strcmp(compare->name,name)!=0)
{
compare=compare->next;
}
if(compare==NULL)
{
printf("\n\n没有这位联系人!!\n\n");
}
else
{
printf("\n\n查找内容如下:\n\n");
printf("联系人:%s",compare->name);
printf("\n电话:%d",compare->number);
printf("\n\n请确认是否修改这位联系人?(Y/N)");
char *YN; //这里随便定义了一直指针没有申请空间
scanf("%s",YN); //按道理这里是应该报错的,但是却没有!!而且仅仅在这个自定义函数里!!
while(strcmp(YN,"Y")!=0 && strcmp(YN,"N")!=0)
{
printf("\n输入无效信息,请再次输入:");
scanf("%s",YN);
}
if(strcmp(YN,"Y")==0)
{
do
{
printf("\n\n请输入修改的内容:\n1.修改联系人名字\n2.修改联系人电话\n请输入");
scanf("%d",&select);
switch(select)
{
case 1:changename(compare);break;
case 2:changenum(compare);break;
default:break;
}
}
while(select!=1 && select!=2);
}
printf("\n\n\n输入任意键调回主菜单");
select=getchar();
getchar();
}
一个指针变量没有初始化,那么这个指针变量中存储的地址有 3 种情况
1. 这个指针变量中存储的是一个已经使用过的变量的地址
2. 这个指针变量中存储的是一个还没有使用过的变量的地址
3. 这个指针变量中存储的是一个无效的的地址,例如 0x00001234
如果是你的那个例子,情况 1,程序只要之后不再使用那个被 scanf 覆盖的变量,就不会有任何问题
情况 2 一般来说程序会停止运行,也有可能不会停止运行,如果覆盖进去的值正好是那个变量的取值范围,例如那个变量可以存储 1、2、3,那个变量已经默认初始化成了 3,但是 scanf 把那个变量覆盖成了 1,程序不会停止运行,但是得到的结果一定是不对的
情况 3 程序肯定会停止运行
|