定义buffer大于1M出错

sno_guo 2012-03-27 05:34:39
各位好:

刚开始学习C++,使用的是VC++6.0, 在我的一个实例中定义了一个buffer,如下:

#define MAX_PACKET_SIZE (1024*1024)
(在一个函数中有如下定义)
unsigned char dealBuf[MAX_PACKET_SIZE];

这样在运行的时候,没有错误,可是在DEBUG模式下执行时,提示说,
弹出对话框,说:应用程序发生异常: unknown software exception (0xc00000fd) 位置为 0x007310e7


而我 把定义改成 100*1024 就没有问题, 请问下各位:我怎样定义一个1M大小的buffer ,谢谢!
...全文
177 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2012-03-27
  • 打赏
  • 举报
回复
缺省地,栈的大小刚好是1M,如果在栈上开了1M的buffer,其它的东东比如局部变量就没有地方放了,所以会出错。

要解决这样的问题有3个办法:
1. 在栈上分配的buffer小一点。
2. 不要将buffer分配在栈上,可以通过malloc或者new分配到堆上。
3. 调整VC编译器的参数,让栈更大一点。

以上3个方法,任何一个都可以。
sno_guo 2012-03-27
  • 打赏
  • 举报
回复
好感动啊, 如果我有多余分的话! 一定多加点,分真的不多了,呵呵
感谢各位的帮忙,谢谢!
nwao7890 2012-03-27
  • 打赏
  • 举报
回复
你这是在栈上申请,在堆上申请会好。UCHAR* p =new UCHAR[BUFSIZE];......do somting..... delete p;
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
shn521 2012-03-27
  • 打赏
  • 举报
回复
函数中 unsigned char dealBuf[MAX_PACKET_SIZE];
是在栈中申请内存,可能不能申请太大的。

全局的是在全局数据区,new是在堆中,可以
maoloverme1 2012-03-27
  • 打赏
  • 举报
回复
可能超过了函数堆栈的大小,用new吧。
shn521 2012-03-27
  • 打赏
  • 举报
回复
或者把unsigned char dealBuf[MAX_PACKET_SIZE];放到全局

mlinlin 2012-03-27
  • 打赏
  • 举报
回复
alloc没有?
shn521 2012-03-27
  • 打赏
  • 举报
回复
unsigned char *p=new unsigned char[1024*1024];
用完后记得delete

64,318

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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