vc++ 6.0 不支持 ANSI C吗?

Sword_Sharp 2001-08-05 11:32:32
有如下代码:
#include <stdio.h>
#include <malloc.h>

char *GetExp()
{
char Expression[81];
gets(Expression);
return Expression;
}


void main()
{
char *s;
s = GetExp();
printf("String is : %s \n", s);
getchar();

}
用vc++6.0 和tc2.0都编译通过但是用vc++6.0编译的得不到正常结果而用tc2.0编译却可以正常运行为何?
...全文
230 点赞 收藏 24
写回复
24 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
huxianwei 2001-11-07
你返回的是一个局部指针,退出函数后就释放了。
回复
turbo 2001-11-07
返回局部变量的地址是很不安全的,TC可能是由于DOS系统的内存特点而侥幸通过,Windows下面的内存管理就复杂多了
回复
ggggwwww 2001-11-07

C不是个严谨的语言,不检查越界异常。

GetExp()函数中Expression是局部变量,在函数自身的堆栈中生成,当函数退出时,它的空间会被收回
另外TC并不动态分配变量内存。而VC动态分配变量内存,当函数退出时,局部的空间会被收回

最后你的这一段代码肯定有错:
char *s;
gets(s);
因为你的S只是个指针变量,程序一开始里未给出S所指的地址。即S一开始可以指向的是一个未知地址如0XFFFFFFFF,而这段地址你可能是没有访问权限的(不在同一进程)。当你使用gets(s)语句时,系统会将键盘缓冲里的字符保存在这段地址里,从而造成出错。


这么试一下:

#include <stdio.h>
#include <malloc.h>

void GetExp(char *pExpression)
{
gets(Expression);
}


void main()
{
char Expression[1024]={0}
GetExp(Expression);
printf("String is : %s \n", Expression);
getchar();
}


void main()
{
char s[1024]={0};
gets(s);
printf("%s", s);
getchar();
}


回复
Sword_Sharp 2001-10-17
不好意思,才给分!
回复
zogy 2001-08-09
这是C与C++的不同。

C不是个严谨的语言,不检查越界异常。

GetExp()函数中Expression是局部变量,在函数自身的堆栈中生成,当函数退出时,它的空间会被收回。在C++环境中再次访问,就会出现越界异常。建议你改为 char *Expression=new char[81]; 使其在程序的堆中生成。

最后,别忘了 delete []s;

回复
afc 2001-08-09
就是,还没有给指针分配内存呢,肯定要出问题!
回复
rediori 2001-08-09
同意楼上的 指针没有初始化过啊
你编译的时候一定有警告的
只不过你忽视了
回复
Benni 2001-08-08
你sb!
char *s;
gets(s);
程序不崩掉才怪!
回复
maptrix 2001-08-08
代码有错误,tc2能正常运行确实是巧合。
回复
coolxiao 2001-08-08
巧合是指其实你访问的内存已经无效,只是系统还没有改变它,所以你读出的数据是正确的,但这里存在潜在的危险。用函数返回指针要慎重。
回复
wyzegg 2001-08-06
就是这样的
真怪呀
回复
Sword_Sharp 2001-08-06
wuxq(好好) 能说的具体点吗?
回复
wuxq 2001-08-06
老谭的书上返回的指针实质上是传入的指针.
回复
Sword_Sharp 2001-08-06
各位:谭浩强得《C程序设计》一书中“返回指针的函数”部分就有我这样的用法而且没有用静态变量本人也用tc 2.0和vc++6.0 编译果数次显示出调用前后的地址是一致的但是用vc++6.0编译后还是的不到结果,而tc可以为何?是tc 2.0与vc++6.0处理函数调用得方法不同吗?
回复
hwenjian 2001-08-06
Try this one.

#include <stdio.h>
#include <malloc.h>

char *GetExp()
{
static char Expression[81];
gets(Expression);
return Expression;
}


void main()
{
char *s;
s = GetExp();
printf("String is : %s \n", s);
getchar();

}
回复
Sword_Sharp 2001-08-06
darkay(火凤凰) 如何给你分
回复
Sword_Sharp 2001-08-06
darkay(火凤凰) 给你分
回复
Sword_Sharp 2001-08-06
感谢各位;
用tc2。0编译了好几遍都可以,不只巧合事指那方面?
to darkay(火凤凰) :能麻烦你给改写一下吗?谢谢!
回复
darkay 2001-08-06
同意楼上的不是觉得不安全而是绝对不应该这样做的,这样存在指针悬挂的问题,你在主程序中使用的指针实际上已经不是你期望的东西,它随时都会改变了。
tc2.0运行通过只是一个巧合而已(令一个说法是tc2.0自动将字符数组的定义变成静态的,但是我不是很同意这个说法,在ANSI C之前却是会这么处理,数组都是静态的)
有两种解决的方法,
一、使用static修饰Expression数组。
二、动态分配内存给Expression,记得在主程序体中释放。
《你的C与语言基础还不是很好哦,我的意思不是你的语法不要,而是语言习惯不要,就象说医英语一样,你记得很多的语法也只能应付好考试,不能和别人正常沟通)
回复
coolxiao 2001-08-06
这样写不太好吧,s=GetExp()以后Expression[]的空间已经退栈,虽然程序中没有再写入其他东西,但总觉得不安全啊。
回复
加载更多回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2001-08-05 11:32
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……