找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 3658|回复: 4

[经验分享]一个在函数体内定义超长变量的经验

[复制链接]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2014-4-26 09:54:03 | 显示全部楼层 |阅读模式
假设有一个这样的结构体:
  1. struct _SSS
  2. {
  3.     UCHAR xx[PAGE_SIZE];
  4. };
复制代码

如果直接在(驱动的)函数体里这么定义(定义结构体变量):
  1. SSS var;
  2. var.xx[0]=1;
复制代码

在编译为32位程序时会提示_chkstk错误。主要原因是局部变量太大。
遇到这种情况,需要动态申请空间(定义结构体指针变量):
  1. SSS *pvar=MALLOC(sizeof(SSS));
  2. pvar->xx[0]=0;
复制代码

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
 楼主| 发表于 2014-4-27 10:48:00 | 显示全部楼层
补充一句,编译为64位程序,使用“定义结构体变量”的方式,也不会有警告。

1

主题

39

回帖

0

精华

铜牌会员

积分
299
发表于 2014-5-17 15:05:04 | 显示全部楼层
使用编译器参数可以控制堆栈监测机制


#pragma warning(disable:4172)

void*        Entry(void)
{
        unsigned char temp[0x1000000] = {0};
        for (unsigned int i =0; i<0x1000000; i++)
        {
                temp=i;
        }
        return (&temp);
}

Stack.jpg
IDA.jpg

编译后,并没有产生堆栈检测调用。

30

主题

693

回帖

0

精华

钻石会员

积分
2815
发表于 2015-5-5 09:24:38 | 显示全部楼层
每日六贴  健康生活

0

主题

25

回帖

0

精华

初来乍到

积分
19
发表于 2015-5-5 09:53:25 | 显示全部楼层
还要注意一点:内核中栈的默认大小只有4K的
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表