为什么cygwin下运行释放内存释放错误的程序不报运行时错误?

x-teamer团队 2009-11-20 11:07:52
下面这段程序在VS2005下会报一个运行时错误,原因是内存释放错误, 但Cygwin下为什么运行可以安全通过?

100分相送,期待高手解答.

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
struct A
{
int a;
char b;
};

struct B
{
int a;
char b;
int c;
};

int main(void )
{
A *a = NULL;
a = (A*) malloc(sizeof(A));
memset(a, 0, sizeof(B));
free(a);
printf("helloWOrld");
}
...全文
166 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
james_hw 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ostrichmyself 的回复:]
引用 10 楼 akirya 的回复:
引用 7 楼 ostrichmyself 的回复:
问题是vs2005的通过率是0%, 而Cygwin下通过率为100%, 这就不正常了.

你release试试
VC debug版作了简单的越界检查,方便找问题。


答案是正确的, vc的release不报错

再求GCC的release开关参数。

想测试下
[/Quote]

看来lz是想测试debug和release的区别,算了,我白操心了
x-teamer团队 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 akirya 的回复:]
引用 7 楼 ostrichmyself 的回复:
问题是vs2005的通过率是0%, 而Cygwin下通过率为100%, 这就不正常了.

你release试试
VC debug版作了简单的越界检查,方便找问题。
[/Quote]

答案是正确的, vc的release不报错

再求GCC的release开关参数。

想测试下
mstlq 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 akirya 的回复:]
引用 7 楼 ostrichmyself 的回复:
问题是vs2005的通过率是0%, 而Cygwin下通过率为100%, 这就不正常了.

你release试试
VC debug版作了简单的越界检查,方便找问题。
[/Quote]
如果是vs2005
DEBUG版会直接死在free(a)那一句……
越界访问的地方,好像恰恰就是记录a所指向已分配内存大小的地方……
程序马上SB了……
james_hw 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ostrichmyself 的回复:]
问题是vs2005的通过率是0%, 而Cygwin下通过率为100%, 这就不正常了.
[/Quote]

晕死,越界的后果是未知的,100%是如何定义的?你使用release版本即便操作10000次不蹦难道就能保证操作100000000次不蹦,我知道以前有一个项目就是因为内存越界了但是不蹦,结果测试也没检测出问题来,最后在千禧年的时候崩了,损失是用百万来计数的。记住编译器能检测出越界异常就谢天谢地了
菜鸟二号 2009-11-20
  • 打赏
  • 举报
回复
嘿嘿
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ostrichmyself 的回复:]
问题是vs2005的通过率是0%, 而Cygwin下通过率为100%, 这就不正常了.
[/Quote]
你release试试
VC debug版作了简单的越界检查,方便找问题。
mstlq 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ostrichmyself 的回复:]
问题是vs2005的通过率是0%, 而Cygwin下通过率为100%, 这就不正常了.
[/Quote]
请楼主仔细想一想“后果未知”的含义……
这个是汉语问题了……
x-teamer团队 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mstlq 的回复:]
B的size比A大……
请不要玩内存访问越界的东西……

Cygwin下为什么运行可以安全通过,那只是运气好……
写这样的代码会被鄙视的……
[/Quote]

拜托,这是做测试...
x-teamer团队 2009-11-20
  • 打赏
  • 举报
回复
问题是vs2005的通过率是0%, 而Cygwin下通过率为100%, 这就不正常了.
  • 打赏
  • 举报
回复
越界后果未知 .......
mstlq 2009-11-20
  • 打赏
  • 举报
回复
B的size比A大……
请不要玩内存访问越界的东西……

Cygwin下为什么运行可以安全通过,那只是运气好……
写这样的代码会被鄙视的……
james_hw 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 guzhijie1981 的回复:]
我靠;又被抢先了;我的分啊
[/Quote]

能结贴才有分
guzhijie1981 2009-11-20
  • 打赏
  • 举报
回复
我靠;又被抢先了;我的分啊
james_hw 2009-11-20
  • 打赏
  • 举报
回复
memset(a, 0, sizeof(B)); 越界了,能安全通过不代表没问题
x-teamer团队 2009-11-20
  • 打赏
  • 举报
回复
没有纯Linux环境,哪位大侠帮我在linux测试下,会不会报运行时异常,谢谢!

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧