为什么同样的C程序在VC++6.0可以运行,在VS2010就不可以?

#include<stdio.h>
void swap(int *p1,int *p2);
void main()
{
int a,b;
int *pointer_1,*pointer_2;
scanf("%d %d,&a,&b");

pointer_1=&a;
pointer_2=&b;

if(a<b)
{
swap(int pointer_1,int pointer_2); //实现的是交换操作

}
printf("\n%d>%d\n",a,b);
}

void swap(int *p1,int *p2)
{
int temp;
printf("I'm swaping...");
printf("please wait^_^");

temp=*p1;
*p1=*p2;
*p2=temp;

}

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函数,所以用它编译不会出现告警。追问

你这样说,我就明白了,谢谢!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-11-20
遇到这种问题建议你再安个dev c++(或者别的基于gcc编译器的),并修改代码与gcc兼容。本回答被网友采纳
第2个回答  2019-11-19

修改见下图标黄处

追问

即使我改了,再新打过代码了,在VS2010里依然无法运行...提示如下:
f:\arvin\指针1\指针1\3.c(7): warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
f:\vs2010\vc\include\stdio.h(304) : 参见“scanf”的声明

追答

scanf改为scanf_s

追问

谢谢你!!

第3个回答  2019-11-19
可能因为版本的问题吧,版本不一样有可能不能实行通用。
第4个回答  2019-11-20
调用swap的时候 不要加int
相似回答