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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥同样的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函数,所以用它编译不会出现告警。追问

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

参考技术A 遇到这种问题建议你再安个dev c++(或者别的基于gcc编译器的),并修改代码与gcc兼容。 参考技术B

修改见下图标黄处

追问

即使我改了,再新打过代码了,在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

追问

谢谢你!!

参考技术C 可能因为版本的问题吧,版本不一样有可能不能实行通用。 参考技术D 调用swap的时候 不要加int

C# VS2010 Express:程序在IDE中运行,但不是exe,为啥? [关闭]

【中文标题】C# VS2010 Express:程序在IDE中运行,但不是exe,为啥? [关闭]【英文标题】:C# VS2010 Express: Program runs in IDE, but not as exe, why? [closed]C# VS2010 Express:程序在IDE中运行,但不是exe,为什么? [关闭] 【发布时间】:2014-07-11 02:42:23 【问题描述】:

我已经为此工作了两天。我已经编写了 6 个月的代码。

我的程序在打开所有异常的情况下进行了测试。没有错误。我可以连接到控制硬件……它可以通信、运行,是我正在构建的新 CNC 系统的 GUI。

可以根据需要完美运行,具有数百种功能。我一直在使用硬件进行构建和测试。始终在 IDE 中进行测试。

现在我准备创建“.exe”文件并运行...不行...什么???您的意思是它在 IDE 中完美运行,而当该 IDE 创建 exe 时,它​​不会吗?我很沮丧。

我已经阅读和阅读,并尝试了很多东西......但最让我烦恼的是什么。它是否在 IDE 中完美运行,但在 IDE 之外无法运行。

很多推荐都是用我没有的工具。我有快递版。

在 IDE 中,它在调试和不调试的情况下运行。 转到外部,并尝试在没有 IDE 的情况下运行 exe,不行。甚至从来没有开始。 为什么?

提前感谢您的帮助!


我尝试通过外部进入 bin/release 或 bin/debug 来运行。双击.exe。 我也安装了,它也做同样的事情。不要跑。 活动信息。也显示此信息。下面。


问题签名: 问题事件名称:CLR20r3 问题签名 01:truemachinecnc4.exe 问题签名 02:1.0.0.0 问题签名 03:53bf29fb 问题签名 04:KMotion_dotNet 问题签名 05:1.0.1.0 问题签名 06:5133ac38 问题签名 07: 3a 问题签名 08:e1 问题签名 09:KMotion_dotNet.DMException 操作系统版本:6.1.7601.2.1.0.768.3 区域设置 ID:1033 附加信息 1:0a9e 附加信息 2:0a9e372d3b4ad19135b953a78882e789 附加信息 3:0a9e 附加信息4:0a9e372d3b4ad19135b953a78882e789

【问题讨论】:

如果您甚至不知道您的代码是 C# 还是 C++(由于标签混合),您希望如何为您提供好的推荐? 我所有的代码都是 C#...并且要访问与硬件相关的软件,我有一个 .net .dll 可以让我访问所有硬件代码,主要是 C++ 和 C。 【参考方案1】:

您是如何尝试在 IDE 之外执行程序的?如果要将文件复制到新位置,则可能存在对其他 DLL 的依赖项,需要与它一起复制。

检查 Windows 事件日志。当您的程序无法启动时,它应该有异常信息。在您的描述中包含这些详细信息。

【讨论】:

我已添加此信息。上面...我去 bin/release 或 bin/debug,以及安装并尝试运行。都给出相同的错误。 问题与我没有编写的另一个程序的文件夹位置和依赖关系有关。一旦进入文件夹,它就包含了它最终工作的所有 dll。

以上是关于为啥同样的C程序在VC++6.0可以运行,在VS2010就不可以?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我安装的vc6.0之后,编译程序的时候总会出现这个图标呢?

为啥在VC++6.0下用C语言调用引用参数如:void Creat(SqList &L)总是提示&出错?

简述在VC++6.0环境下运行一个C++源程序的步骤

我的vc 6.0 可以编译,可用链接,点击执行,显示ready,但弹不出黑框

C语言(VC++6.0)获取cpu编码

vc++6.0和VC2017区别