• 全部
  • 问答

关于内存出错提示的困惑

mux 2000-11-03 12:18:00
加精
我做的是用vc4.0开发的基于windows操作系统的C程序,程序总是忽然终止并弹出一对话框提示:
XXXXXXXX指令引用XXXXXXXXX内存,该内存不能为[read].
而十分不可思义的是当程序执行到调用函数的return语句时也经常出现此类情况.
哪一位高手明白怎么会事敬请多多指导,火急!火急!

...全文
181 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
singlerace 2000-11-13
很可能是返回地址被非法覆盖了。在函数中一步步跟踪,同时查看[ebp+4](返回地址的存放地址)处有没有被改掉。
回复
老魏2006 2000-11-07
还有可能:堆栈出现问题
回复
whoo 2000-11-05
如果仅仅是在return 是出错,可能是调用参数或调用模式引起的问题。布置你是不是调用dll的函数。
回复
土豆 2000-11-05
除了他们说的以外,我想可能还有这种情况,这种情况我前两天刚碰到过,搞了我俩天。

可能在你的函数中访问内存越界了,然后函数返回的时候就会出现这种情况,并且是在return 语句以后,也就是在函数退出时出栈出错,我跟踪过,反汇编,当跟踪到pop ebp时看到ebp的值变为00000003,而这个地址在NT中是不能访问的,这是NT的隔离区的地址,我们知道ebp关系到程序中变量地址的访问。所以我觉得你也可能是这种情况。
后来我发现实我在循环中访问地址越界了。你可以检查一下,你是不是也有这种情况。

仅供参考。
回复
ggggwwww 2000-11-03
你的Return是Return什么?
可单步跟一下,看看你的返回变量的指针的地址。
返回时,最好用的是全局数组返回。或是函数的入口参数给定的指针。

例如:
static char FileNameArray[80]={0};
char * GetFileName()
{
memcpy(FileNameArray,"time.log",7);
return FileNameArray;
}

or
void GetFileName(char * FileName)
{
memset(FileName,0x00,8);
memcpy(FileName,"time.log",7);
return;
}


如果你是这样写的话应该会出错:

char * GetFileName()
{
char FileNameArray[80]={0};
memcpy(FileNameArray,"time.log",7);
return FileNameArray;
}


你的函数代码是什么?
可否贴上来或Email to ggggwwww@21cn.com。
回复
Mr_Ldh 2000-11-03
是不是使用了内存分配函数但没有#include <malloc.h>,或者内存模式不正确(small large or huge?)本人就犯过这样的错误。
回复
mux 2000-11-03
感谢诸位指教, 小弟受益非浅
有一点需特别说明 , 本人做的C是程序, 而非C++,
程序中的确引用了一些指向文件名的字符串数组指针 , 但到执行到return处出错 ,好象与此无关
请问遇到此类问题时应从何处入手 , 是否有现成的书籍可做参考
敬请大家继续指教!
回复
w3guy 2000-11-03
一般出现这样的问题原因为:
1. 使用未初始化的指针
2. 释放(delete,free)未初始化的指针
3. 使用已被释放的指针
4. 重复释放指针
关于return 时出现这样的情况可能是你的局部对象的析构函数中出现了以上错误.
回复
Arthur_Ma 2000-11-03
在nt下内存分配很严格,有很多空间是系统保留的。
你的问题十有八九时指针指在了这些空间地址,管理好你的指针吧
回复
老魏2006 2000-11-03
跟踪你的指针是否有效?
指针有没有初始化?
回复
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2000-11-03 12:18
社区公告
暂无公告