为什么同样的C程序在VC++6.0可以运行,在VS2010就不可以?
发布网友
发布时间:2022-06-24 22:48
我来回答
共5个回答
热心网友
时间:2022-06-30 15:59
swap(int pointer_1,int pointer_2); //实现的是交换操作
尝试了一下,虽然VC++ 6.0很老,也对上面这句报错,编译失败,应改为:
swap(pointer_1, pointer_2); //实现的是交换操作
函数定义和声明的时候才需要参数类型,调用的时候不需要,是因为声明与定义的时候已经告诉过编译器pointer_1, pointer_2的类型是int*。
至于scanf,在VS 2010中给出是警告,编译运行都是没有问题的。编译器给出警告的意思是告诉你这样做可以,但有出错的风险。具体到本例,就是说scanf不安全,比如:
char buf[5];
scanf("%s",buf);
如果用户执行时输入12345,程序就会将‘1’、‘2’、‘3’、‘4’、‘5’等5个字符和一个0存入buf,可是buf只能存储5个字符,这样buf就溢出了,多出来的字符将在内存中覆盖后续程序代码,使得程序执行时出现奇奇怪怪的行为,或者干脆出现段错误。
鉴于上述原因,微软从vc++2005开始引入scanf_s函数,这样在调用的时候,就需要加入buf长度:
scanf_s("%s", buf, sizeof(buf));
当输入12345时,scanf_s直接给一个0,说明输入超过缓冲区buf的长度,输入无效,如此就不会溢出了。
scanf_s函数现已被C11标准接纳,所以今后尽量用它,而scanf很可能在未来被标准去掉,变为不可用。
VC++ 6.0在1998年发布,那时还没纳入scanf_s函数,所以用它编译不会出现告警。追问你这样说,我就明白了,谢谢!
热心网友
时间:2022-06-30 15:59
遇到这种问题建议你再安个dev c++(或者别的基于gcc编译器的),并修改代码与gcc兼容。
热心网友
时间:2022-06-30 16:00
修改见下图标黄处
热心网友
时间:2022-06-30 16:00
可能因为版本的问题吧,版本不一样有可能不能实行通用。
热心网友
时间:2022-06-30 16:01
调用swap的时候 不要加int