memcpy时出现access violation错误

sirdan 2011-07-24 05:37:12
程序如下:

struct share myshare = {0};

LPVOID lpData;
HANDLE hRecvMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READWRITE, 0, 0x50F00, "myDataMap");//4165c
if (hRecvMap != NULL)
{
lpData = (LPBYTE)MapViewOfFile(hRecvMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if (lpData == NULL)
{
CloseHandle(hRecvMap);
hRecvMap = NULL;
}
}

memcpy(lpData, &myshare, sizeof(struct share));

我创建了一块共享内存,但是往里面复制数据时,会跳出access violation错误。结构体里面没有指针,但是占用空间很大。如果将结构体里的数组改小,这个错误就不会发生。但我现在需要大数组。
请问,有什么办法能解决此问题?
...全文
470 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangshao5210 2012-07-07
  • 打赏
  • 举报
回复
无语,我用的虚拟机!
sirdan 2011-08-01
  • 打赏
  • 举报
回复
这个问题解决了,以一种我完全没有料到的方式解决的。
把系统重启一遍就行了。
很奇怪吧。
我用的是虚拟机,安装了xp和开发工具,平时很少关机,一直suspend。
可能的原因是,xp的内存被耗尽?
辰岡墨竹 2011-07-25
  • 打赏
  • 举报
回复
因为内存映射是系统级别的东西,而栈是进程私有的,而且要函数来维护,一旦你函数退出时释放了struct,却忘记Close内存映射,就完蛋了。千万别写这种代码。
辰岡墨竹 2011-07-25
  • 打赏
  • 举报
回复
4MB数据放栈里,还要创建内存映射么?栈可是会频繁变化的,在那里面还能放可执行的东西么?
如果你的Windows开启了DEP,堆栈应该是不可执行的,应该无法映射PAGE_EXECUTE_READWRITE吧。
而且数据稍微大了点,请用VirtualAlloc分配内存来用,那才是创建共享内存的标准方式,而且不需要EXECUTE就别用它。
在栈里创建可不是好习惯。
sirdan 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 g_spider 的回复:]

CreateFileMapping 支持 PAGE_EXECUTE_READWRITE ?

PAGE_READONLY

PAGE_READWRITE

PAGE_WRITECOPY
[/Quote]
在xp-sp1以后的版本中,CreateFileMapping 开始支持 PAGE_EXECUTE_READWRITE。
我这里是瞎写的,感觉与这个参数无关。
sirdan 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 nightkids_008 的回复:]

使用管道文件进行共享。。。多大都行了就
[/Quote]
windows下也有管道文件吗?
即便有,速度也还是太慢,我需要快速访问这些共享数据。
sirdan 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wyfwx 的回复:]

如果你数据有100G,是否你要把它们全部都加载进内存???
[/Quote]
100G的数据当然有100G数据的处理方法,可是现在我仅仅想把4M的数据放入共享内存,却始终不成功。
对现在的机器配置而言,4M根本不算什么,为什么总是报错呢?
wyfwx 2011-07-25
  • 打赏
  • 举报
回复
就算你想用100G的内存,os也不会同意
wyfwx 2011-07-25
  • 打赏
  • 举报
回复
如果你数据有100G,是否你要把它们全部都加载进内存???
nightkids_008 2011-07-25
  • 打赏
  • 举报
回复
使用管道文件进行共享。。。多大都行了就
sirdan 2011-07-25
  • 打赏
  • 举报
回复
自己顶顶
sirdan 2011-07-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jernymy 的回复:]

考虑是超过了
楼主先用小的区域去memcpy
C/C++ code

//用于共享内存的结构体
struct share
{
char skip[2][2]; //跳过的窗口类
struct item dic[128]; //翻译字典
int cnt1; //长度为1的单词数
int cnt2; //长度小于等于2的单词数
int cnt3; //长度小于等于3的单词数
int cnt4;……
[/Quote]
的确是超过了,这个我是知道的。如果用小的值,不会出现错误。
可我现在需要往里存入大量的数据,不知道该怎么解决。
jernymy 2011-07-24
  • 打赏
  • 举报
回复
考虑是超过了
楼主先用小的区域去memcpy

//用于共享内存的结构体
struct share
{
char skip[2][2]; //跳过的窗口类
struct item dic[128]; //翻译字典
int cnt1; //长度为1的单词数
int cnt2; //长度小于等于2的单词数
int cnt3; //长度小于等于3的单词数
int cnt4; //长度小于等于4的单词数
int cnt5; //长度小于等于5的单词数
int cnt6; //长度小于等于6的单词数
int cnt7; //长度小于等于7的单词数
int cnt8; //长度小于等于8的单词数
int cnt9; //长度小于等于9的单词数
int sum; //单词总数
int skipcnt; //跳过窗口类总数
struct ini myini; //配置文件
};
至善者善之敌 2011-07-24
  • 打赏
  • 举报
回复
commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。
G_Spider 2011-07-24
  • 打赏
  • 举报
回复
CreateFileMapping 支持 PAGE_EXECUTE_READWRITE ?

PAGE_READONLY

PAGE_READWRITE

PAGE_WRITECOPY
lifesider 2011-07-24
  • 打赏
  • 举报
回复
0x50F00这个值为331520字节,你算算你需要拷贝的数据超过这个数没,如果超过了,肯定会失败
sirdan 2011-07-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lifesider 的回复:]

是不是你的file mapping的最大值不够
[/Quote]
不是,这个最大值我再三计算过了,而且,即便再改大一些或改大很多还是会出错。

本来怀疑是默认栈空间太小,我在vc中,通过project->setting->link->output->reserve设置为0x5000000,也就是80M,这个值应该足够大了.Commit这个值我不理解是什么意思,没有设置.
lifesider 2011-07-24
  • 打赏
  • 举报
回复
是不是你的file mapping的最大值不够
sirdan 2011-07-24
  • 打赏
  • 举报
回复
结构体的定义如下:
struct item
{
unsigned short crc;
WCHAR han[32];
WCHAR dai[64];
WCHAR odai[32];
//WCHAR sdai[32];
};

struct ini
{
int msgbox; //是否有对话框
char font[32]; //用什么字体
int fontsize; //字体大小
char dic[MAX_PATH]; //字典位置
char skip[MAX_PATH];//跳过列表
};

//用于共享内存的结构体
struct share
{
char skip[32][32]; //跳过的窗口类
struct item dic[1024]; //翻译字典
int cnt1; //长度为1的单词数
int cnt2; //长度小于等于2的单词数
int cnt3; //长度小于等于3的单词数
int cnt4; //长度小于等于4的单词数
int cnt5; //长度小于等于5的单词数
int cnt6; //长度小于等于6的单词数
int cnt7; //长度小于等于7的单词数
int cnt8; //长度小于等于8的单词数
int cnt9; //长度小于等于9的单词数
int sum; //单词总数
int skipcnt; //跳过窗口类总数
struct ini myini; //配置文件
};

70,020

社区成员

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

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