|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 程序肯定会停止运行
|
|