打印

一种快速清空结构体的方法

[复制链接]
10572|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
brakejoke|  楼主 | 2012-10-17 22:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 brakejoke 于 2012-10-17 22:08 编辑

先自定义一个结构体,比如:
struct Table{
short int a;
long b;
short int  c;
long d;
};
struct Table Tab[10];


以下的函数即是用于清空结构体的,需要传入的两个参数分别为结构体的起始地址和结构体的长度。
void Clear(unsigned char *Ptr, int Size )
{
        while(Size!=0)
        {
                *Ptr++ = 0;
                Size --;
        }
}

函数的调用如下。
void main()
{
         Clear(( unsigned char *)&Tab[0],sizeof(Tab));
        // 将结构体的起始地址进行强制转型,传入起始地址,用sizeof函数求出结构体的大小。
}


这个算法比较简单,也没什么含量。但是希望大家有什么好的算法,也分享出来给大家,大家一起学习进步。

相关帖子

沙发
xinzha| | 2012-10-17 23:53 | 只看该作者
如果这是arm,那么就有几处可以改进,一是结构的定义不够规范(在极端情况下甚至会导致死机),二是可以以4字节为单位清零,不必以字节为单位,当然如果调用次数不多,几乎看不出性能的变化。

使用特权

评论回复
板凳
aozima| | 2012-10-18 00:36 | 只看该作者
有一个函数叫memset

使用特权

评论回复
地板
brakejoke|  楼主 | 2012-10-18 00:58 | 只看该作者
2# xinzha 可否将您的写法贴出来呢?

使用特权

评论回复
5
阿南| | 2012-10-18 09:39 | 只看该作者
支持这种分享讨论帖。

使用特权

评论回复
6
wlq_9| | 2012-10-18 10:36 | 只看该作者
memset( (void *)&struct_name, 0x00, sizeof(struct_name));

使用特权

评论回复
7
xinzha| | 2012-10-18 11:25 | 只看该作者
本帖最后由 xinzha 于 2012-10-18 13:31 编辑

结构改成下面这种样子比较好,保证了结构的四字节对齐。当然如果你不这么写编译器可能也会做优化调整为四字节对齐,但是会有你预想不到的情况发生。
struct Table{
short int a;
short int  c;
long b;
long d;
};
在这种情况下,结构的清零可以用如下方式,
void longClear(unsigned long *Ptr, int Size )
{
        while(Size > 0)
        {
                *Ptr++ = 0;
                Size --;
        }
}

调用时使用Clear(( unsigned long *)&Tab[0],sizeof(Tab) / 4);
这么使用的前提是你的编译选项等设置严格遵守四字节对齐的准则。

使用特权

评论回复
8
jiangfuquan999| | 2012-10-18 13:12 | 只看该作者
:lol

使用特权

评论回复
9
brakejoke|  楼主 | 2012-10-18 20:01 | 只看该作者
7# xinzha 原来是字节对齐的问题。这个倒是我没有仔细考虑过的问题,确实我们搞嵌入式的,还是需要注意这些细节,毕竟有时候是操作设备嘛。谢谢你的分享哦。

使用特权

评论回复
10
brakejoke|  楼主 | 2012-10-18 20:02 | 只看该作者
6# wlq_9 这种方法也不错,简单方便。:)

使用特权

评论回复
11
john_lee| | 2012-10-19 10:32 | 只看该作者
楼主还需要多多学习。

使用特权

评论回复
12
大道至简| | 2012-10-20 14:06 | 只看该作者
我都用系统自带的memset函数

使用特权

评论回复
13
大道至简| | 2012-10-20 14:07 | 只看该作者
一句话,一次搞定

使用特权

评论回复
14
shuxmpx123| | 2013-12-20 15:05 | 只看该作者
wlq_9 发表于 2012-10-18 10:36
memset( (void *)&struct_name, 0x00, sizeof(struct_name));

为什么我用这个清除后报错呢,指向结构体的指针出错了

使用特权

评论回复
15
outstanding| | 2013-12-21 10:34 | 只看该作者
:lol  用memset

使用特权

评论回复
16
chenjinst| | 2013-12-25 09:59 | 只看该作者
用memset 还是比较方便的!

使用特权

评论回复
17
chhyxf| | 2014-8-12 16:43 | 只看该作者
楼主想法很好,但我个人觉得这样会由于对齐的原因而误删除了其他数据,还有,如果分配的内存不连续也就不能用这个方法了

使用特权

评论回复
18
ilikedota| | 2015-1-22 18:41 | 只看该作者
我还是比较支持memset,因为系统已经做好了的函数干嘛不用呢。

使用特权

评论回复
19
ayb_ice| | 2015-1-23 11:07 | 只看该作者
#define mem_clr(mem) memset( (void *)&mem, 0x00, sizeof(mem))

使用特权

评论回复
20
小将wzj| | 2017-11-3 10:07 | 只看该作者
很不错的分享讨论

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

7

帖子

0

粉丝