为什么同样的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

为什么同样的C程序在VC++6.0可以运行,在VS2010就不可以?
VC++ 6.0在1998年发布,那时还没纳入scanf_s函数,所以用它编译不会出现告警。

VC6.0中可以运行。VS2010就出问题了。
首先肯定从功能上VS2010是绝对可以替代VC++ 6.0的,这个你完全不用怀疑,只是VC++ 6.0下面的库肯定是比VS2010小的。但是VC++ 6.0有个最大的好处,你建立一个CPP文件也可以编译,不需要建立一个工程,而VS2010是以工程组织的,必须得建立工程来编译,有时候就麻烦一些了。RE补充:不一定可以,但是...

VS2010和VC6.0的区别是什么哦?
比如同一个错误,可能vs2010能够让你根据他的出错信息准确找到错误,vc6.0在一些情况下就很难做到。而且vc6.0对代码的“格式”要求比较严格 比如变量的定义要放在程序开始,不能再循环中初始化定义一个新的变量等等诸如此类问题。所以有时会导致某些程序可在vs2010中运行但不能再vc6.0中编译通过。vs...

为什么我用vc++6.0和vs2010编译同一段代码、运行速度天差地别
这个可能是因为6.0和2010所使用的函数库可能不同,链接的系统库不同 你可以采用下面的方法再试一下:1、创建项目的时候选择一个空白的控制台项目,就是创建完以后一个文件都没有的那种。然后添加一个c++源文件,将代码写进去 2、编译的时候记得用release模式 3、记得运行的时候关闭电脑的其他程序,尽量...

为什么我用vc++6.0和vs2010编译同一段代码、运行速度天差地别
这个可能是因为6.0和2010所使用的函数库可能不同,链接的系统库不同 你可以采用下面的方法再试一下:1、创建项目的时候选择一个空白的控制台项目,就是创建完以后一个文件都没有的那种。然后添加一个c++源文件,将代码写进去 2、编译的时候记得用release模式 3、记得运行的时候关闭电脑的其他程序,尽量...

vs2010与vc++6.0的编程有什么区别?
1、编译器的不同 VC6.0更初级,更适合初学C语言的人使用,但是由于VC6.0推出的时间比较久,因此有很多变量和函数定义的方法都跟不上时代了,而且与win7会有一些不兼容;VS2010:相对功能比较完善,兼容性更好,代码风格和代码提示对于编程者来说更完善,编写程序更方便。2、实现功能的不同 从VS2002...

VC6.0和VS2010兼容吗?
Studio绝大多数情况下无法打开高版本工程。而其中VS6.0完全无法打开之后版本的工程,因为工程文件格式已经变了。C++方面,VC6.0是C++标准确定前开发的,所以在很多语法尤其是C++标准库上和之后的版本不兼容。也就是VC6.0上可以正常运行的代码在之后版本的VC++上可能无法运行,反之亦然。

vc++6.0和vs2010的编程代码差别大吗?
1、vc++6.0:由C语言发展起来的,也支持C语言的编译。6.0版本是使用最多的版本,很经典。最大的缺点是对于模版的支持比较差。2、vs2010:拖曳式便能完成软件的开发。简简单单的操作便可以实现一个界面的生成。但拖曳的界面,也应当有相应的代码来实现功能。参考资料来源:百度百科-Visual Studio ...

vc++6.0和vs2010的编程代码差别大吗?
智能设备应用程序和Office插件。三丶优点和缺点是不同的 1.vc++6.0:由C语言开发,还支持C语言编译。版本6.0是最常用的版本,非常经典。最大的缺点是对模板的支持不足。2.Vs2010:软件开发可以通过拖动完成。简单的操作就可以实现一个界面的生成。但拖动接口时,还应具备相应的代码实现功能。

一台电脑同时装上VC++6.0和VS2010冲突吗?
不冲突,不在同一个目录下不会产生冲突的,两者完全兼容,但是不建议先装高版本后装低版本,最好从低版本到高版本装。Microsoft Visual C++ 6.0,简称VC6.0,是微软于1998年推出的一款C++编译器,集成了MFC 6.0,包含标准版(Standard Edition)。专业版(Professional Edition)与企业版(Enterprise ...

相似回答